Postgres时间戳与时区

Was*_*eem 7 postgresql pgadmin postgresql-9.3

我的'events'表中有'event_date_time'列,类型为'timestamp with timezone'.我的python烧瓶应用程序保存日期,'2014-08-30 02:17:02+00:00'但postgres自动将其转换为'2014-08-30 07:17:02+05'.它将时间戳转换为我当地的时区,即巴基斯坦.我想保存而不转换.我试过了

设置时区='UTC'

它确实将时区更改为"UTC",但pgadmin3仍然保存转换时间.

我正在使用MAC OS和Postgresql 9.3.

Luc*_*cas 18

pgadmin显示小时+5的原因是因为您的系统时区设置为此.当您将"带时区的时间戳"值保存为GMT +或 - 任何值时,系统会将输入的任何时区偏移到GMT(或UTC),这样当您去检索它时,您可以指定所需的时区它显示在.

例如,让我们确定当前的时间...纽约.

select now()::timestamp with time zone at time zone 'America/New_York';

在要求它返回'2014-08-23 08:50:57.136817'时.周六早上8:50,如果你是迂腐的话,还是8:51.

现在,如果我们采取相同的时间并在GMT中显示它,我们将看到不同的结果:

select '2014-08-23 08:50:57.136817 America/New_York'::timestamp with time zone at time zone 'GMT';

现在有一个'2014-08-23 12:50:57.136817'的新时间......进入"未来"5个小时!

最后让我们获取原始时间戳并将其显示在我认为的巴基斯坦时区(PKT)中并查看它显示的内容

select '2014-08-23 08:50:57.136817 America/New_York'::timestamp with time zone at time zone 'PKT';

结果?'2014-08-23 17:50:57.136817'进一步走向未来!

我必须再次强调它能够做到这一点的原因是因为它总是将输入时间偏移转换为UTC或GMT.Postgres以这种方式处理其所有"带时区的时间戳"数据类型.它旨在避免时区问题,如夏令时等.

您的问题似乎是python正在以+00的偏移量插入时间,如果这应该是当地时间,那么就postgres而言,您将关闭5个小时.如果不确切知道python正在做什么查询,我会假设你可能想看看它以确保它给你正确的时间,大概set timezone='PKT'应该是一个修复.无论哪种方式,当您使用浏览器(例如pgadmin)查看带时区的时间戳时,时间戳将转换为您当地的时区,这就是您看到+5的原因.

或者,如果您希望在+00处查看这些时间,则必须在SELECT查询中指定所需的时间.