【问题标题】:Convert timestamp to postgres timestamp将时间戳转换为 postgres 时间戳
【发布时间】:2018-04-08 23:58:51
【问题描述】:

目前我的时间戳格式如下:

2018-04-02T09:00:00+09:30

如何转换上面的时间戳以适应 postgres 的时间戳列,如下所示?

2018-04-02 09:00:00 +09.30

另外如何使用python在加载到postgres表之前先转换xml时间戳?

【问题讨论】:

    标签: python postgresql timestamp


    【解决方案1】:

    这不需要任何转换,它是一个普通的ISO 8601 time stampPostgreSQL supports multiple input formats for time stamps

    select timestamp with time zone '2018-04-02T09:00:00+09:30';
          timestamptz       
    ------------------------
     2018-04-01 18:30:00-05
    (1 row)
    

    您会注意到它以 UTC 格式存储它。那正是你想要的。来自the docs,

    对于timestamp with time zone,内部存储的值始终采用 UTC(通用协调时间,传统上称为格林威治标准时间,GMT)。具有指定明确时区的输入值使用该时区的适当偏移量转换为 UTC。如果输入字符串中没有说明时区,则假定它在系统的TimeZone参数指示的时区中,并使用时区的偏移量转换为UTC。

    timestamp with time zone value 输出时,它总是从 UTC 转换为当前时区,并显示为该时区的本地时间。 要查看另一个时区的时间,请更改时区或使用 AT TIME ZONE 构造(参见第 9.9.3 节)。

    【讨论】:

    • 我可以选择不存储到UTC吗?像这样存储它是 '2018-04-02 09:00:00 +09:30' 吗?此时间戳已从 UTC 转换
    • @Derek 您永远不会将时间戳存储在 UTC 以外的任何其他中。所有时间戳都标准化为 UTC。然后它们会显示在应用程序中您想要的任何时间戳中(假设列类型为TIMESTAMP WITH TIME ZONE)。例如,在psql 中,您可以使用TimeZone 配置变量设置您希望时间戳显示的时区。
    • 感谢您的建议!但是,我无法将其存储为 utc 格式,因为我已经有一个存储 utc 格式的列。因此,我需要存储这个时间戳,因为它没有时区
    • @Derek 提出问题,因为您不了解某些内容。 (或阅读上面的文档)。
    【解决方案2】:

    如果您知道您将始终以该格式获取数据,您可以执行以下操作:

    >>> a = "2018-04-02T09:00:00+09:30"
    >>> 
    >>> b = a.replace('T', ' ').replace('+', ' +')
    >>> b
    '2018-04-02 09:00:00 +09:30'
    

    虽然很丑,但是很管用。

    将您的输入解释为日期然后以所需格式打印总是更安全。

    【讨论】:

    • 感谢您的建议!你能简单解释一下 .replace('+', '+') 的作用吗?
    • 它将“+”替换为“+”,在“+”之前添加一个额外的“空格”。
    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 2015-03-03
    • 2021-08-18
    • 2013-04-07
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多