在不同时区使用的应用程序中存储Oracle中的日期
Storing dates in Oracle in an app used in different time zones
我目前正在决定如何处理我的web应用程序,该应用程序使用Oracle存储数据,PHP作为服务器端语言,JavaScript作为客户端。
该应用程序将在英国托管,但来自英国、美国和其他欧洲国家的用户将登录并使用它。此时,如果用户操作导致任何"可审核"事件发生,则会将一条记录保存到审核跟踪中,并根据该记录保存SYSDATE。
当用户查看审核跟踪时,我希望时间显示在他们的本地时区。
我的想法是:-由于SYSDATE是Oracle服务器上系统时钟的时间,我应该将Oracle服务器的时区设置为UTC(夏令时没有更改)。这将确保所有日期都保存在一个恒定的时区中,因此转换它应该不会很困难。-在浏览器中使用JavaScript的getTimezoneOffset()函数将时间转换为本地时间,以添加/减去分钟。
这是正确的方法吗,还是我错过了什么?
在这之前,您的方法听起来不错:
在浏览器中使用JavaScript的getTimezoneOffset()函数将时间转换为本地时间,以添加/减去分钟。
你不想那样做,因为这会带来不同的时刻。如果要将UTC值传递给浏览器,请将其作为ISO8601格式传递,然后在构造函数中使用,例如new Date('2013-01-01T01:23:45.678Z')
。
如果你需要支持旧的浏览器,或者你想更好地控制格式,那么可以考虑使用moment.js。
此外,您应该注意,如果您使用的值所在的时间段与当前有效的夏令时规则不同,则当前版本的JavaScript可能会将UTC时间转换为夏令时附近的值。你可以在我的博客上阅读更多关于这方面的内容。您将在时间或日期方面遇到此问题。
如果这对你来说很关键,那么你需要避免用JavaScript进行转换,而是用PHP代码进行转换。(当然,这意味着您需要向用户询问他们的时区,例如America/Los_Angeles
,这样PHP时区函数就可以使用它了。)
在表和PL/SQL代码中,始终使用数据类型TIMESTAMP WITH LOCAL TIMEZONE
。然后,日期和时间总是正确插入并显示在当前用户会话的时区中。
数据类型"TIMESTAMP WITH TIMEZONE"也包含时区信息,但为了正确显示,您必须转换为用户会话时区。当你在美国时,你可能不喜欢看到"2012-12-12 15:45:00-01:00",尽管它代表了正确的时间。
SYSDATE是数据类型"DATE",它不包含任何时区信息,请使用CURRENT_TIMESTAMP
或LOCALTIMESTAMP
作为会话时间戳,使用SYSTIMESTAMP
作为Oracle服务器所在的时区。
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- Emberjs应用程序加载在除Index之外的所有路由上
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- angular 1.5应用程序中的导航栏
- 在Web应用程序中使用Highcharts javascript
- angularjs+rails应用程序中未显示模板
- 使用acess代币登录Facebook,并通过网络应用程序离线发布
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- 科尔多瓦页面类应用程序中的多个谷歌地图
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- Angularjs-utils高亮过滤器在搜索时破坏应用程序
- 在phonegap应用程序内部重定向不起作用
- 使用谷歌应用程序脚本从工作表中获取值并将其显示在文本框中
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- Node.js正在更改应用程序以使用集群模块
- 在openshift node js应用程序中获取请求
- 如何在Facebook上的iframe应用程序中使后退按钮返回到上一页
- 在不同时区使用的应用程序中存储Oracle中的日期