我正在使用postgresql在数据库中存储一些日期.
在我的应用程序中,它完全了解时区是至关重要的,我正在客户端、服务器和数据库之间进行一些基本测试。
我正在从我在 GWT 中做的浏览器应用程序发送日期,并在 postgresql 上读取日期。
我的测试:
客户端始终处于GMT时区,并且我为每个案例发送始终相同的日期。
13/04/2012 00:00:00 GMT+00
在 posgres 上,我正在为每个测试更改时区。在测试之间,我正在从表中删除所有日期。
要更改位置上的时区,我在 {PostgreSQL HOME}\9.1\data\postgresql.conf 上执行此操作,将 timezene 设置为我想要的时间。
测试:客户端: 13/04/2012 00:00:00 GMT+00
第一次测试 - 美国东部时间 - 12/04/2012 19:00:00-05根据 postgresql 文档 EST = GMT - 5
第二次测试 - 位置 GMT + 5 - 12/04/2012 19:00:00-05
第三次测试 - 格林威治标准时间 - 5 - 13/04/2012 05:00:00+05
现在我的问题出现了:根据文档,EST = GMT - 5。那么,我为什么要反过来阅读呢?我在这里错过了什么吗?
编辑我的测试的技术方面:
在客户端上,我发送此消息:2012 年 4 月 13 日 00:00:00 GMT+00。在
服务器上,我正在使用JDBC在数据库上写入:
将java.utils.date转换为java.sql.timestamp
java.sql.Timestamp sqlTimeStamp = new java.sql.Timestamp(date.getTime());
(date 是来自客户端的 java.utils.Date)
设置预准备语句PreparedStatement ps = con.prepareStatement("INSERT INTO teste.dates (dates_tz, dates_ntz) VALUES (?, ?);"
ps.setTimestamp(1, sqlTimeStamp);
为了记录,这只是我想了解的事情,因为总的来说它非常适合我的目的。
请考虑文档中的警告:
要记住的另一个问题是,在 POSIX 时区名称中, 正偏移用于格林威治以西的位置。到处 否则,PostgreSQL遵循ISO-8601约定,积极 时区偏移量位于格林威治以东。
看起来你看到的格林威治标准时间的相反迹象正是这种背离的影响。postgresql.conf 中指定的时区可能用 POSIX 规则解释,但后来由 SQL 使用 ISO-8601 规则(任何人真正使用的规则)显示。
当墙上的时钟显示时区"+5"的2012-04-13 00:00
时,伦敦的时间(GMT 或 UTC)2012-04-12 19:00
。
如果您居住在美国,您当地的时区可能是"-5"。那里是午夜时分,伦敦是早上05:00
。
事情就是这样。这个关于在PostgreSQL中处理时区的详细答案可能会帮助你理解。