【问题标题】:Postgres timestamp with timezone带有时区的 Postgres 时间戳
【发布时间】:2014-08-22 22:31:22
【问题描述】:

我的“事件”表中有“事件日期时间”列,类型为“带有时区的时间戳”。我的 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。

【问题讨论】:

  • 您的意思是您的选择查询正在返回 GMT+5 的时间,并且您希望您的 python 插入遵守这个时间而不是 GMT+2,或者您想在 GMT+0 选择?无论哪种方式,带时区的时间戳都会将所有条目隐式保存为 UTC,并在选择时转换时间。
  • 我认为该字段应该是time stamp without timezone
  • @Lucas 如果带时区的时间戳将所有条目隐式保存为 UTC,那么为什么 pgadmin 以 GMT+5 显示时间?
  • @WingedPanther 我尝试了没有时区的时间戳及其工作。谢谢。但是时间戳不应该与时区一起工作吗?

标签: postgresql pgadmin postgresql-9.3


【解决方案1】:

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 查询中指定您想要这个。

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 2020-09-19
    • 2022-11-22
    • 2016-01-15
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多