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

2024-04-29 14:35:22 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将本地时间中的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时间的唯一转换。


Tags: 字符串orghttpdatetime时间dstutcsi
3条回答

首先,将字符串解析为一个简单的datetime对象。这是datetime.datetime的实例,没有附加时区信息。有关分析日期字符串的信息,请参阅datetime.strptime的文档。

使用^{}模块,该模块附带时区+UTC的完整列表。找出本地时区是什么,从中构造一个时区对象,并操作它并将其附加到原始日期时间。

最后,使用datetime.astimezone()方法将datetime转换为UTC。

源代码,使用本地时区“美洲/洛杉矶”,用于字符串“2001-2-3 10:11:12”:

import pytz, datetime
local = pytz.timezone ("America/Los_Angeles")
naive = datetime.datetime.strptime ("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S")
local_dt = local.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)

在那里,您可以根据需要使用strftime()方法格式化UTC日期时间:

utc_dt.strftime ("%Y-%m-%d %H:%M:%S")

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

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/calendar函数的总结:

time.strptime
字符串-->;元组(不应用时区,因此与字符串匹配)

time.mktime
本地时间元组-->;自epoch起的秒数(始终为本地时间)

time.gmtime
自epoch以来的秒数-->;UTC中的元组

以及

calendar.timegm
以UTC表示的元组-->;自epoch以来的秒数

time.localtime
从epoch开始的秒数-->;本地时区中的元组

datetime模块的utcnow()函数可用于获取当前的UTC时间。

>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'

正如汤姆在上面提到的那样:http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/说:

UTC is a timezone without daylight saving time and still a timezone without configuration changes in the past.

Always measure and store time in UTC.

If you need to record where the time was taken, store that separately. Do not store the local time + timezone information!

注意-如果您的任何数据位于使用DST的区域中,请使用pytz并查看John Millikin的答案。

如果要从给定字符串中获取UTC时间,并且幸运地处于世界上不使用DST的区域,或者您的数据仅与UTC偏移,而不应用DST:

-->;使用本地时间作为偏移值的基础:

>>> # Obtain the UTC Offset for the current system:
>>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
>>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
>>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

-->;或者,从已知偏移量,使用datetime.timedelta():

>>> UTC_OFFSET = 10
>>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

更新:

因为python 3.2datetime.timezone是可用的。您可以使用以下命令生成一个时区感知的datetime对象:

import datetime

timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)

如果您准备好进行时区转换,请阅读以下内容:

https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7

相关问题 更多 >