2012-04-13 60 views
2

我正在使用postgresql在数据库中存储一些日期。
在我的应用程序中,它是完全了解时区的基础,并且我正在进行一些基本的测试,包括客户端,服务器和数据库。PostgreSQL 9.1时区

我从GWT浏览器的应用程序发送日期,并阅读postgresql上的日期。

我的测试:

客户永远是在GMT时间,而我总是发送每种情况相同的日期。
13/04/2012 00:00:00 GMT + 00

在posgres我改变了时区为每个测试。在测试之间,我将删除表格中的所有日期。

要更改posgres上的时区,我在{PostgreSQL HOME} \ 9.1 \ data \ postgresql.conf中将timezene设置为我想要的值。

测试: 客户:13/04/2012 00:00:00 GMT + 00

第一测试 - posgres EST - 12/04/2012 19:00:00-05 根据postgresql documentation EST = GMT - 5
第二测试 - posgres GMT + 5 - 12/04/2012 19:00:00-05
第三测试 - posgres GMT - 5 - 05 13/04/2012:00:00 + 05

现在我的问题出现了:根据文档,EST = GMT - 5。那么为什么我会以相反的方式阅读它? 我在这里错过了什么吗?

编辑 我的测试技术方面:
在客户端我送这样的:2012年04月13日00:00:00 GMT + 00。
在我使用JDBC的数据库编写服务器:
转换java.utils.date到 的java.sql.Timestamp

java.sql.Timestamp sqlTimeStamp = new java.sql.Timestamp(date.getTime());
(日期是java.utils.Date是来自于客户端)

设置准备语句
PreparedStatement ps = con.prepareStatement("INSERT INTO teste.dates (dates_tz, dates_ntz) VALUES (?, ?);"

ps.setTimestamp(1,sqlTimeStamp); ...

根据记录,这只是我想明白了,因为总体而言,它很适合我的目的..

+1

请显示您的测试中使用的实际陈述。 – 2012-04-13 11:47:34

+0

在客户端我发送这个:2012年4月13日00:00:00。 在使用JDBC写在db上的服务器上: java.sql.Timestamp sqlTimeStamp = new java.sql.Timestamp(date.getTime()); (日期为来自客户端的java.utils.Date) INSERT INTO dbFoo.dates_table(date_tz)VALUES(?); ps.setTimestamp(1,sqlTimeStamp); – 2012-04-13 13:10:45

+0

请编辑您的问题,而不是将信息放入评论。这比较容易阅读。 – 2012-04-13 13:13:38

回答

11

考虑到warning in the documentation

另一个问题需要注意的是,在POSIX时区名称, 积极的偏移用于格林威治以西的位置。其他地方,PostgreSQL遵循ISO-8601惯例,即在格林威治以东的时区偏移量为正的 。

它看起来像朝着格林威治时间的相反标志,你看到的正是这种分歧的影响。 postgresql.conf中指定的时区可能使用POSIX规则进行解释,但随后由SQL使用ISO-8601规则(任何人真正使用的规则)显示。

+0

+1 - 很好的捕获。 – 2012-04-13 19:04:22

+0

谢谢!这回答了我的疑惑。 :) – 2012-04-14 07:12:16

+1

这是我最近2小时以来让我困惑的原因。这不是一个很好的解决方案吗?感谢您的解释! – virtualmic 2013-04-22 05:24:04

1

当墙上的时钟显示2012-04-13 00:00在时间区“+5” ,伦敦时间(GMT或UTC)为2012-04-12 19:00

如果你住在美国,你当地的时区可能是'-5'。在午夜的时候,伦敦早上是05:00

就是这样。有关handling of time zones in PostgreSQL的详细解答可能会帮助您理解。

+0

我知道。 事情是:格林威治标准时间5是完全一样的文件根据文件。并在嘘嘘它显示相反.EST等于GMT + 5. – 2012-04-13 12:42:08