Postgres的本地和现场环境的日期不同

时间:2013-07-16 09:45:13

标签: database postgresql

我在数据库中有"9999-12-30 18:30:00+00"之类的日期。

当我从本地计算机访问时,它将以9999-12-31 00:00:00.0(在印度) 当我从现场访问时,它将以9999-12-30 00:00:00.0(在美国)

进行

数据类型为timestamp with time zone

可能是错的。提前谢谢......

以下代码用于保存日期

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

Date date = formatter.parse("12/31/9999");

SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");

String formattedDate = formatter1.format(date);
//formatter1.setTimeZone(TimeZone.getDefault());

Date finalDate = formatter1.parse(formattedDate);

System.out.println(finalDate);

保存为"9999-12-30 18:30:00+00"

2 个答案:

答案 0 :(得分:2)

timestamp with time zone(与其对应timestamp without time zone相对)的重点是,该值是根据运行查询的客户端的时区动态旋转的。

由于您坚持要连接到同一个数据库,就好像它意味着两个客户端都应该检索相同的值,可能您不明白它们检索不同的值是正常的。

为了说明,这是一个可重现的示例,其中包含您的值:

create table ttz(t timestamptz);
insert into ttz values('9999-12-30 18:30:00+00');
  • 当我的时区是默认的'localtime',实际上是'欧洲/巴黎',在未来的日期,如果我们的世界仍然存在,应该比UTC提前一小时,这就是我得到的:
=> select * from ttz;
           t            
------------------------
 9999-12-30 19:30:00+01
  • 现在让我们切换到印度的时区:
=> set timezone to 'Asia/Calcutta';
=> select * from ttz;
             t             
---------------------------
 9999-12-31 00:00:00+05:30

因此,如果我假装在印度,它会输出与您在印度的会话相同的价值。这是预期的结果。

  • 关于美国的结果

美国有几个时区,因此您应首先检查服务器使用的是哪个时区。 奇怪的是,为了从UTC 9999-12-30 00:00:00获得9999-12-30 18:30的结果,您需要具有+18:30的偏移量,这在实践中并不存在,尽管它会重合与印度相比,如果从UTC向西而不是东方。

=> set timezone to 'UTC+18:30';
=> select * from ttz ;
             t             
---------------------------
 9999-12-30 00:00:00-18:30
(1 row)

因此可以怀疑您在美国的客户会话时间配置不正确。

有关使用UTC偏移时符号约定冲突的问题,另请参阅PostgreSQL 9.1 timezones

答案 1 :(得分:0)

首先,确保本地和实时数据库在服务器端使用正确的时间 - 两者都应该使用NTP来同步服务器时间。

如果使用正确的日期时间格式Z or X,它会在您的打印时间戳中保留时区信息(但对于本地和实时数据库,它可能在文本上看起来不同)。

如果您不想保留此信息或不愿意更改格式,则可以在检索日期时使用AT TIME ZONE语法,以便始终在某个预定时区获取,{{1 }}:

UTC

对于时区,您可以使用通常的语法,例如SELECT dt AT TIME ZONE 'UTC' FROM mytable (与'+00'相同),'UTC'等。