0

"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"

4

2 回答 2

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');
  • 当我的时区是默认的“本地时间”实际上是“欧洲/巴黎”时,如果我们的世界仍然存在,那么在这个未来的日期,应该比 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

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

  • 关于美国的结果

美国有几个时区,因此您应该首先检查您的服务器使用哪个时区。奇怪的是,为了9999-12-30 00:00:00从 UTC获得结果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)

因此,可以怀疑您在美国的客户端会话只是配置了错误的时区。

另请参阅PostgreSQL 9.1 时区,了解使用 UTC 偏移量时符号约定冲突的问题。

于 2013-07-16T13:30:56.287 回答
0

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

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

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

SELECT dt AT TIME ZONE 'UTC' FROM mytable

对于此处的时区,您可以使用通常的语法,例如'+00'(same as 'UTC')、'+08'等。

于 2013-07-16T10:41:40.150 回答