Database 在博士后的本地和现场环境中,日期的到来是不同的

Database 在博士后的本地和现场环境中,日期的到来是不同的,database,postgresql,Database,Postgresql,我在数据库中有类似于“9999-12-30 18:30:00+00”的日期 当我从本地计算机访问时,它的名称为9999-12-31 00:00:00.0(在印度) 当我从live访问时,它的名称是9999-12-30 00:00:00.0(在美国) 数据类型为带时区的时间戳 有什么问题吗?先谢谢你 下面是我用来保存日期的代码 SimpleDataFormat格式化程序=新的SimpleDataFormat(“MM/dd/yyyy”); 日期=格式化程序.parse(“1999年12月31日”);

我在数据库中有类似于
“9999-12-30 18:30:00+00”
的日期

当我从本地计算机访问时,它的名称为
9999-12-31 00:00:00.0
(在印度) 当我从live访问时,它的名称是
9999-12-30 00:00:00.0
(在美国)

数据类型为带时区的时间戳

有什么问题吗?先谢谢你

下面是我用来保存日期的代码

SimpleDataFormat格式化程序=新的SimpleDataFormat(“MM/dd/yyyy”);
日期=格式化程序.parse(“1999年12月31日”);
SimpleDataFormat Formatter 1=新的SimpleDataFormat(“yyy-MM-dd HH:MM:ss z”);
字符串formattedDate=formatter1.format(日期);
//formatter1.setTimeZone(TimeZone.getDefault());
Date finalDate=formatter1.parse(formattedDate);
系统输出打印LN(最终日期);

它正在另存为
“9999-12-30 18:30:00+00”

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

如果您使用的datetime格式正确,它将在打印的时间戳中保留时区信息(但对于本地数据库和live db,它在文本上可能会有所不同)

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

SELECT dt AT TIME ZONE 'UTC' FROM mytable

对于时区,您可以使用常见语法,如
'+00'
(与
'UTC'
)、
'+08'
,等等。

带时区的
时间戳的整个点(与不带时区的
时间戳相对应)是指根据运行查询的客户端的时区动态旋转该值

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

为了说明这一点,这里有一个可复制的示例,其中包含您的值:

create table ttz(t timestamptz);
insert into ttz values('9999-12-30 18:30:00+00');
  • 如果我的时区是默认的“localtime”,实际上是“Europe/Paris”,在未来的这个日期,如果我们的世界仍然存在,它应该比UTC早一个小时,我得到的结果如下:
  • 现在让我们切换到印度的时区:
因此,如果我假装在印度,它的输出值与您在印度的会话相同。这是预期的结果

  • 关于美国的结果
美国有几个时区,所以您应该首先检查服务器使用哪个时区。 奇怪的是,为了从UTC获得
9999-12-30 00:00:00
的结果,您需要有+18:30的偏移量,这在实践中是不存在的,尽管从UTC向西而不是向东与印度一致

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


有关使用UTC偏移量时符号约定冲突的问题,请参见。

是的,一切都是正确的,因为您的db中定义了
+00
时区。所以这取决于时区。@AlexStybaev我现在需要做的是在这两个地方获得相同的结果请提供用于从DB加载数据的代码段,所以我可以告诉你如何改进它。我正在使用java和hibernate@AlexStybaev我更新了我的问题。我正在从位于USI的本地访问同一数据库。如果由不同的客户查询时区…
,但从同一数据库得到的结果不同,我会非常惊讶。我也无法理解这一点问题非常感谢你。你是对的。事实上,当我从live server插入记录和从live server检索记录时,我遇到了问题(因为两者的数据库是相同的)。我理解这个问题
=> 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
=> set timezone to 'UTC+18:30';
=> select * from ttz ;
             t             
---------------------------
 9999-12-30 00:00:00-18:30
(1 row)