如何将本地时间的datetime字符串转换为UTC时间的字符串?

我确信我以前做过这个,但找不到它,所以希望将来能帮助我(和其他人)做到这一点。

澄清:例如,如果我的本地时区(+10)是2008-09-17 14:02:00,我希望生成一个具有等效UTC时间的字符串:2008-09-17 04:02:00。

此外,从http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/请注意,一般来说,这是不可能的,因为DST和其他问题没有从本地时间到UTC时间的唯一转换。


当前回答

我在这里找到了另一个问题的最佳答案。它只使用python内置库,不需要您输入本地时区(在我的情况下是一个要求)

import time
import calendar

local_time = time.strptime("2018-12-13T09:32:00.000", "%Y-%m-%dT%H:%M:%S.%f")
local_seconds = time.mktime(local_time)
utc_time = time.gmtime(local_seconds)

我在这里重新发布答案,因为这个问题在谷歌中弹出,而不是根据搜索关键字链接的问题。

其他回答

简单的

我是这样做的:

>>> utc_delta = datetime.utcnow()-datetime.now()
>>> utc_time = datetime(2008, 9, 17, 14, 2, 0) + utc_delta
>>> print(utc_time)
2008-09-17 19:01:59.999996

的实现

如果你想更花哨一点,你可以把它变成一个函子:

class to_utc():
    utc_delta = datetime.utcnow() - datetime.now()

    def __call__(cls, t):
        return t + cls.utc_delta

结果:

>>> utc_converter = to_utc()
>>> print(utc_converter(datetime(2008, 9, 17, 14, 2, 0)))
2008-09-17 19:01:59.999996

怎么样——

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

如果seconds为None,则将本地时间转换为UTC时间,否则将传入的时间转换为UTC时间。

在python 3.9.0中,将本地时间local_time解析为datetime。Datetime对象,只需使用local_time.astimezone(Datetime .timezone.utc)。

怎么样——

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

如果seconds为None,则将本地时间转换为UTC时间,否则将传入的时间转换为UTC时间。

谢谢@rofly,从字符串到字符串的完整转换如下:

import time
time.strftime("%Y-%m-%d %H:%M:%S", 
              time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00", 
                                                    "%Y-%m-%d %H:%M:%S"))))

我对时间/日历功能的总结:

time.strptime 字符串——>元组(没有应用时区,所以匹配字符串)

time.mktime 本地时间元组——自epoch以来>秒(始终是本地时间)

time.gmtime seconds since epoch——UTC中的>元组

and

calendar.timegm tuple in UTC——> seconds since epoch

time.localtime 自epoch ->元组在本地时区的秒数