在Python中将datetime.date转换为UTC时间戳

381

我正在使用Python处理日期,需要将它们转换为UTC时间戳以在JavaScript中使用。以下代码无法正常工作:

>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)

将日期对象首先转换为datetime也没有帮助。我尝试了这个链接上的示例,但:

from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)

现在要么:

mktime(utc.localize(input_date).utctimetuple())
或者
mktime(timezone('US/Eastern').localize(input_date).utctimetuple())

能够工作。

因此通用问题:如何将日期转换为距离UTC时代以秒为单位的时间?


可能是如何在Python中将本地时间转换为UTC?的重复问题。 - Piotr Dobrogost
37
我不确定我是否同意将其标记为重复。虽然解决方案相似,但问题并不相同。一个(这个)试图从datetime.date创建时间戳,另一个试图将一个时区的字符串表示转换为另一个时区。作为寻找此问题解决方案的人,我可能无法得出结论,认为后者会提供我正在寻找的答案。 - DRH
6
datetime(date.year,date.month,date.day).timestamp() - Julian
4
可能是在Python中,如何将datetime对象转换为秒?的重复问题。 - Trevor Boyd Smith
注意:mktime比其他方法慢10倍。由于你很可能在热路径中执行此操作,所以这很重要。 - Remko
12个回答

0

将日期转换为UTC时间戳,最好在生成时间戳之前明确指定时区:

from datetime import date, datetime, time, timezone


def utc_date_to_timestamp(utc_date: date):
    dt = datetime.combine(utc_date, time(tzinfo=timezone.utc))
    return dt.timestamp()

请注意,在上面的代码片段中,如果我们省略时区规范,那么如果本地时区与GMT(与UTC对齐)不同,就会出现潜在问题。考虑以下示例:
my_date = date(2021, 1, 1)
wrong_timestamp = datetime.combine(my_date, time()).timestamp()
print(datetime.utcfromtimestamp(wrong_timestamp))  # 2020-12-31 18:00:00

请注意,打印的具体值将因运行代码片段的本地计算机而异。

0

我对这场深入的讨论印象深刻。

我的两分钱:

from datetime import datetime
import time

UTC 时间戳为:

timestamp = \
    (datetime.utcnow() - datetime(1970,1,1)).total_seconds()

或者,

timestamp = time.time()

如果现在的结果来自于datetime.now(),并且处于相同的DST时区

utcoffset = (datetime.now() - datetime.utcnow()).total_seconds()
timestamp = \
    (now - datetime(1970,1,1)).total_seconds() - utcoffset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接