【问题标题】:Can't make sense of date conversion to UTC无法将日期转换为 UTC
【发布时间】:2019-12-30 19:45:10
【问题描述】:

我有一个包含 UTC 日期和时间的字符串(不是字符串的一部分,但我知道它是 UTC)。所以我使用以下代码创建了一个感知日期时间对象:

>>> import datetime
>>> import pytz
>>> mystr = '01/09/2018 00:15:00'
>>> start_time = pytz.utc.localize(datetime.datetime.strptime(mystr, '%d/%m/%Y %H:%M:%S'))
>>> start_time
datetime.datetime(2018, 9, 1, 0, 15, tzinfo=<UTC>)
>>> str(start_time)
'2018-09-01 00:15:00+00:00'
>>> start_time.strftime('%s')
'1535757300'

现在一切似乎都很好,但如果我在 shell 中这样做:

$ TZ=UTC date -d @1535757300
Fri Aug 31 23:15:00 UTC 2018

我不应该得到Sat Sep 1 00:15:00 UTC 2018 代替(即,我开始的同一日期)?

【问题讨论】:

  • 如果你做相反的事情 (datetime.datetime.fromtimestamp(1535757300)) 你会得到与 date 实用程序相同的结果
  • 当我运行你的代码时,我从start_time.strftime('%s') 得到'1535760900' 作为我的输出
  • @wpercy 确实,我在另一台机器上尝试过,得到 1535760900。知道这里会发生什么吗?
  • 看起来 %s 不在docs.python.org/3/library/… 中列出的格式说明符之列,这让我有点惊讶。
  • 您可以使用datetime.strptime('{}+0000'.format(mystr), '%d/%m/%Y %H:%M:%S%z') 简化这一点,以避免本地化步骤。然后用datetime.isoformat()测试结果,避免手动转换问题。

标签: python datetime pytz


【解决方案1】:

您需要使用以下内容:

int((start_time - datetime.datetime(1970,1,1)).total_seconds())

因为您使用的是 strftime,所以它引用了您的系统时间,可能是您当地的时区。像上面这样自己计算比较靠谱。

编辑:

正如 OP 的后续帖子所说,只使用 start_time.timestamp() 会更容易,但这仅适用于 Python 3.3* 及更高版本。

【讨论】:

    【解决方案2】:

    经过多次尝试,%s 似乎在官方文档https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior 中列出的格式说明符中不受支持。相反,我使用timestamp() 方法得到了正确的结果:

    >>> start_time.timestamp()
    1535760900.0
    

    【讨论】:

      猜你喜欢
      • 2016-06-20
      • 1970-01-01
      • 2021-04-19
      • 2011-11-06
      • 2016-04-07
      • 2017-10-14
      • 2015-12-26
      • 2011-01-14
      • 1970-01-01
      相关资源
      最近更新 更多