我在数据库中有"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"
答案 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');
=> 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'
等。