【问题标题】:datetime.timestamp not the same as seconds since 1970datetime.timestamp 与自 1970 年以来的秒数不同
【发布时间】:2021-09-16 22:50:37
【问题描述】:

我认为我误解了有关日期时间时间戳的内容。 我读过的描述似乎说时间戳代表 Unix 时间(自 1970 年以来的秒数)

但是当我运行以下命令时

import datetime
date = datetime.datetime(2020, 1 , 1, 0, 0, 0)

time1 = datetime.datetime.timestamp(date)
time2 = (date - datetime.datetime(1970,1,1,0,0,0)).total_seconds()

print(time1)
print(time2)

打印出来:

1577862000.0
1577836800.0

这些不应该是一样的吗?我误会了什么?

【问题讨论】:

  • 我敢打赌你住在山区时区:-)
  • 似乎正好相差 7 小时。您的时区是 UTC-7 吗?
  • 实际上,time2 是正确的,因为两个输入日期时间对象都是幼稚的。问题是datetime.datetime.timestamp(date) 做的比你想象的要多——它将给定的日期/时间从本地时间转换为 UTC,then 计算自 1970 年 1 月 1 日以来的秒数。这就是偏移量的来源。正如@wim 指出的那样,将 tzinfo 设置为 UTC,你会很高兴的。
  • 注意:AFAIK total_seconds() 也不是总秒数(它忽略,AFAIK,闰秒)。 (这种注释在大多数情况下没有用,但是当有闰秒时,您可能会看到奇怪的东西)

标签: python datetime timestamp


【解决方案1】:

时区。 unix 纪元是 1970 年 1 月 1 日 UTC,但您的本地区域不是 UTC,因此当您使用 datetime.datetime(1970,1,1,0,0,0) 创建“天真”日期时间实例时,它与真正的 unix 纪元有几个小时的偏移。

tzinfo=datetime.timezone.utc 附加到两个创建的日期时间实例,您会看到相等。

或者,使用datetime.datetime.fromtimestamp(0) 而不是datetime.datetime(1970,1,1,0,0,0) 来获取与纪元一致的“原始”日期时间实例。

【讨论】:

  • 我认为 OPs 示例中的问题不是 time2 使用幼稚的 datetime(1970,1,1,0,0,0) - time2 是正确的,因为 both 日期时间对象都是幼稚的(= 两个本地时间)。问题是 Unix 时间是如何从 date 得出的,另请参阅我在问题下的评论。
  • @MrFuppes 你说得对,time2 是“正确的”,因为它完全等于((50 * 365) + 12) * 24 * 60 * 60。但问题并没有具体要求这个结果,而是问为什么它们不一样。我试图解释为什么数字不一样,并提出两种不同的方法,使结果相同(即使在每种方法中实际结果不同!)。
  • 如果这里有任何问题,可能是 OP 期望 time1 = datetime.datetime.timestamp(dt) 考虑本地区域,而是假设天真的日期时间是 UTC(即得到time1 = datetime.datetime.timestamp(dt.replace(tzinfo=datetime.timezone.utc)) 的结果)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2013-01-20
  • 2011-08-06
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多