python当前时间字符串_使⽤Python将UTC⽇期时间字符串转
换为本地⽇期时间
使⽤Python将UTC⽇期时间字符串转换为本地⽇期时间
我从来没有把时间转换成UTC。 最近有⼀个请求要让我的应⽤程序能够识别时区,⽽且我⼀直在圈⼦⾥跑。 关于将本地时间转换为UTC的⼤量信息,我发现它相当基本(也许我也做错了),但我不到任何有关将UTC时间轻松转换为最终⽤户时区的信息。
简⽽⾔之,Android应⽤程序向我发送(appengine app)数据,在该数据中是⼀个时间戳。 要将时间戳存储到我正在使⽤的时间:
datetime.utcfromtimestamp(timestamp)
这似乎有效。 当我的应⽤程序存储数据时,它将提前5⼩时存储(我是EST -5)
数据存储在appengine的BigTable上,当检索到它时,它就像⼀个字符串⼀样:
"2011-01-21 02:37:21"
如何在⽤户正确的时区将此字符串转换为DateTime?
此外,⽤户时区信息的推荐存储是什么? (你如何存储tz信息,即:“-5:00”或“EST”等等?)我确信我的第⼀个问题的答案可能包含⼀个参数,第⼆个答案。
11个解决⽅案
299 votes
如果您不想提供⾃⼰的strptime对象,请查看python-dateutil库。 它在zoneinfo(Olson)数据库之上提供了tzinfo实现,以便您可以通过某个规范名称来引⽤时区规则。
from datetime import datetime
from dateutil import tz
# METHOD 1: Hardcode zones:
from_zone = tz.gettz('UTC')
unix时间戳转换日期格式to_zone = tz.gettz('America/New_York')
# METHOD 2: Auto-detect zones:
from_zone = tz.tzutc()
to_zone = tz.tzlocal()
# utc = datetime.utcnow()
utc = datetime.strptime('2011-01-21 02:37:21', '%Y-%m-%d %H:%M:%S')
# Tell the datetime object that it's in UTC time zone since
# datetime objects are 'naive' by default
utc = place(tzinfo=from_zone)
# Convert time zone
central = utc.astimezone(to_zone)
编辑扩展⽰例以显⽰strptime⽤法
编辑2固定API⽤法以显⽰更好的⼊⼝点⽅法
编辑3包含时区的⾃动检测⽅法(Yarin)
Joe Holloway answered 2019-04-24T18:42:43Z
32 votes
这是⼀个不依赖于任何外部库的弹性⽅法:
from datetime import datetime
import time
def datetime_from_utc_to_local(utc_datetime):
now_timestamp = time.time()
offset = datetime.fromtimestamp(now_timestamp) - datetime.utcfromtimestamp(now_timestamp)
return utc_datetime + offset
这避免了DelboyJay⽰例中的时序问题。 Erik van Oosten的修正案中的时间问题较少。
作为⼀个有趣的脚注,上⾯计算的时区偏移量可能与以下看似等效的表达式不同,可能是由于夏令时规则更改:
offset = datetime.fromtimestamp(0) - datetime.utcfromtimestamp(0) # NO!
更新:此代码段具有使⽤当前时间的UTC偏移量的弱点,该偏移量可能与输⼊⽇期时间的UTC偏移量不同。 有关其他解决⽅案,请参阅此答案的评论
要绕过不同的时间,从传⼊的时间开始抓住纪元时间。这就是我的⼯作:
def utc2local (utc):
epoch = time.mktime(utc.timetuple())
offset = datetime.fromtimestamp (epoch) - datetime.utcfromtimestamp (epoch)
return utc + offset
David Foster answered 2019-04-24T18:43:34Z
19 votes
请参阅tzinfo对象的datetime⽂档。 您必须实现⾃⼰想要⽀持的时区。 这些是⽂档底部的⽰例。
这是⼀个简单的例⼦:
from datetime import datetime,tzinfo,timedelta
class Zone(tzinfo):
def __init__(self,offset,isdst,name):
self.offset = offset
self.isdst = isdst
self.name = name
def utcoffset(self, dt):
return timedelta(hours=self.offset) + self.dst(dt)
def dst(self, dt):
return timedelta(hours=1) if self.isdst else timedelta(0)
def tzname(self,dt):
return self.name
GMT = Zone(0,False,'GMT')
EST = Zone(-5,False,'EST')
print datetime.utcnow().strftime('%m/%d/%Y %H:%M:%S %Z')
w(GMT).strftime('%m/%d/%Y %H:%M:%S %Z')
w(EST).strftime('%m/%d/%Y %H:%M:%S %Z')
t = datetime.strptime('2011-01-21 02:37:21','%Y-%m-%d %H:%M:%S')
t = t.replace(tzinfo=GMT)
print t
print t.astimezone(EST)
产量
01/22/2011 21:52:09
01/22/2011 21:52:09 GMT
01/22/2011 16:52:09 EST
2011-01-21 02:37:21+00:00
2011-01-20 21:37:21-05:00a
Mark Tolonen answered 2019-04-24T18:44:01Z
11 votes
如果您希望获得正确的结果,即使对应于模糊的本地时间(例如,在DST转换期间)和/或本地时区的不同时间本地utc偏移量不同,则使⽤pytz时区:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
import tzlocal # $ pip install tzlocal
local_timezone = _localzone() # get pytz tzinfo
utc_time = datetime.strptime("2011-01-21 02:37:21", "%Y-%m-%d %H:%M:%S")
local_time = place(tzinfo=pytz.utc).astimezone(local_timezone)
jfs answered 2019-04-24T18:44:25Z
5 votes
from django.utils import timezone
date
# datetime.datetime(2014, 8, 1, 20, 15, 0, 513000, tzinfo=)
timezone.localtime(date)
# datetime.datetime(2014, 8, 1, 16, 15, 0, 513000, tzinfo=)
frmdstryr answered 2019-04-24T18:44:49Z
4 votes
如果您不想使⽤除info之外的任何其他模块,此答案应该会有所帮助。
如果你不是实例化⽇期开始的那个,但你仍然可以在UTC时间创建⼀个天真的info对象,你可能想尝试这个Python 3.x代码来转换它:
import datetime
d=datetime.datetime.strptime("2011-01-21 02:37:21", "%Y-%m-%d %H:%M:%S") #Get your naive da
tetime object
place(tzinfo=datetime.timezone.utc) #Convert it to an aware datetime object in UTC time.
d=d.astimezone() #Convert it to your local timezone (still aware)
print(d.strftime("%d %b %Y (%I:%M:%S:%f %p) %Z")) #Print it with a directive of choice
注意不要错误地假设如果你的时区当前是MDT,那么夏令时不能⽤于上⾯的代码,因为它打印MST。 您会注意到,如果您将⽉份更改为8⽉,则会打印MDT。
另⼀种获取感知info对象(也在Python 3.x中)的简单⽅法是使⽤指定的时区创建它。 这是⼀个使⽤UTC的例⼦:
import datetime, sys
aware_utc_dt_obj=w(datetime.timezone.utc) #create an aware datetime object
dt_obj_local=aware_utc_dt_obj.astimezone() #convert it to local time
#The following section is just code for a directive I made that I liked.
if sys.platform=="win32":
directive="%#d %b %Y (%#I:%M:%S:%f %p) %Z"
else:
directive="%-d %b %Y (%-I:%M:%S:%f %p) %Z"
print(dt_obj_local.strftime(directive))
如果你使⽤Python 2.x,你可能必须⼦类info并使⽤它来帮助你创建⼀个有意识的datetime对象,因为在Python 2.x中不存在datetime.timezone。
Shule answered 2019-04-24T18:45:48Z
1 votes
我传统上将此推迟到前端 - 从后端发送时间作为时间戳或UTC中的其他⽇期时间格式,然后让客户端出时区偏移并在适当的时区呈现此数据。
对于webapp,这在javascript中很容易做到 - 你可以使⽤内置⽅法很容易地出浏览器的时区偏移量,
然后正确地从后端渲染数据。
Matt Billenstein answered 2019-04-24T18:46:19Z
1 votes
这是⼀个快速⽽⼜脏的版本,它使⽤本地系统设置来计算时差。 注意:如果您需要转换为当前系统未运⾏的时区,这将⽆法⼯作。我已在BST时区下使⽤英国设置对此进⾏了测试
from datetime import datetime
def ConvertP4DateTimeToLocal(timestampValue):
assert isinstance(timestampValue, int)
# get the UTC time from the timestamp integer value.
d = datetime.utcfromtimestamp( timestampValu
e )
# calculate time difference from utcnow and the local system time reported by OS
offset = w() - datetime.utcnow()
# Add offset to UTC time and return it
return d + offset
DelboyJay answered 2019-04-24T18:46:45Z
1 votes
您可以使⽤Fri Jan 21 05:37:21 2011将您的时间转换为⾃Unix纪元以来的秒数和time.localtime转换回来:import calendar
import time
time_tuple = time.strptime("2011-01-21 02:37:21", "%Y-%m-%d %H:%M:%S")
t = calendar.timegm(time_tuple)
ime(t)
给出Fri Jan 21 05:37:21 2011(因为我在UTC + 03:00时区)。
myaut answered 2019-04-24T18:47:17Z
0 votes
import datetime
def utc_str_to_local_str(utc_str: str, utc_format: str, local_format: str):
"""
:param utc_str: UTC time string
:param utc_format: format of UTC time string
:param local_format: format of local time string
:return: local time string
"""
temp1 = datetime.datetime.strptime(utc_str, utc_format)
temp2 = place(tzinfo=datetime.timezone.utc)
local_time = temp2.astimezone()
return local_time.strftime(local_format)
utc = '2018-10-17T00:00:00.111Z'
utc_fmt = '%Y-%m-%dT%H:%M:%S.%fZ'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论