如何在Python中将本地时间转换为UTC?
如何将本地时间的日期时间字符串转换为UTC时间的字符串?
我确定我之前已经做过,但是找不到它,因此SO希望将来可以帮助我(和其他人)做到这一点。
说明:例如,如果我在本地时区(+ 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时间。
解决方案
回答
def local_to_utc(t): secs = time.mktime(t) return time.gmtime(secs) def utc_to_local(t): secs = calendar.timegm(t) return time.localtime(secs)
资料来源:http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
bd808的用法示例:如果源是一个" datetime.datetime"对象" t",则调用为:
local_to_utc(t.timetuple())
回答
首先,将字符串解析为一个简单的datetime对象。这是datetime.datetime
的实例,没有添加的时区信息。有关解析日期字符串的信息,请参见datetime.strptime
的文档。
使用pytz
模块,该模块随附时区+ UTC的完整列表。弄清楚本地时区是什么,从中构造一个时区对象,然后将其操纵并添加到原始日期时间。
最后,使用datetime.astimezone()方法将datetime转换为UTC。
使用本地时区" America / Los_Angeles"的字符串" 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.strptime
字符串->元组(未应用时区,因此匹配字符串)
time.mktime
当地时间元组->自纪元以来的秒数(始终是当地时间)
time.gmtime
自纪元以来的秒数-> UTC中的元组
和
calendar.timegm
以UTC表示的元组->自历元以来的秒数
time.localtime
自纪元以来的秒数->当地时区中的元组
回答
怎么样 -
time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))
如果seconds为" None",则它将本地时间转换为UTC时间,否则将传入的时间转换为UTC。
回答
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'
回答
如果我们更喜欢datetime.datetime:
dt = datetime.strptime("2008-09-17 14:04:00","%Y-%m-%d %H:%M:%S") utc_struct_time = time.gmtime(time.mktime(dt.timetuple())) utc_dt = datetime.fromtimestamp(time.mktime(utc_struct_time)) print dt.strftime("%Y-%m-%d %H:%M:%S")
回答
在这种情况下... pytz是最好的库
import pytz utc = pytz.utc yourdate = datetime.datetime.now() yourdateutc = yourdate.astimezone(utc).replace(tzinfo=None)