我有一个IS8601格式的utc时间戳,我试图将其转换为unix时间。这是我的控制台会话:
In [9]: mydate
Out[9]: '2009-07-17T01:21:00.000Z'
In [10]: parseddate = iso8601.parse_date(mydate)
In [14]: ti = time.mktime(parseddate.timetuple())
In [25]: datetime.datetime.utcfromtimestamp(ti)
Out[25]: datetime.datetime(2009, 7, 17, 7, 21)
In [26]: datetime.datetime.fromtimestamp(ti)
Out[26]: datetime.datetime(2009, 7, 17, 2, 21)
In [27]: ti
Out[27]: 1247815260.0
In [28]: parseddate
Out[28]: datetime.datetime(2009, 7, 17, 1, 21, tzinfo=<iso8601.iso8601.Utc object at 0x01D74C70>)
如你所见,我无法回到正确的时间。如果我使用fromtimestamp(),则小时提前一个,如果我使用utcfromtimestamp()
,它提前六小时有什么建议吗?
谢谢!
答案 0 :(得分:13)
您可以使用datetime.utctimetuple()
在UTC中创建struct_time
,然后将其转换为带calendar.timegm()
的unix时间戳:
calendar.timegm(parseddate.utctimetuple())
这也会处理任何夏令时偏移,因为utctimetuple()
会对此进行规范化。
答案 1 :(得分:0)
我只是猜测,但是由于时区的原因,一小时的差异可能不是因为夏令时开启/关闭。
答案 2 :(得分:0)
naive_utc_dt = parseddate.replace(tzinfo=None)
timestamp = (naive_utc_dt - datetime(1970, 1, 1)).total_seconds()
# -> 1247793660.0
在another answer to similar question中查看更多详情。
然后回来:
utc_dt = datetime.utcfromtimestamp(timestamp)
# -> datetime.datetime(2009, 7, 17, 1, 21)
答案 3 :(得分:0)
import time
import datetime
import calendar
def date_time_to_utc_epoch(dt_utc): #convert from utc date time object (yyyy-mm-dd hh:mm:ss) to UTC epoch
frmt="%Y-%m-%d %H:%M:%S"
dtst=dt_utc.strftime(frmt) #convert datetime object to string
time_struct = time.strptime(dtst, frmt) #convert time (yyyy-mm-dd hh:mm:ss) to time tuple
epoch_utc=calendar.timegm(time_struct) #convert time to to epoch
return epoch_utc
#----test function --------
now_datetime_utc = int(date_time_to_utc_epoch(datetime.datetime.utcnow()))
now_time_utc = int(time.time())
print (now_datetime_utc)
print (now_time_utc)
if now_datetime_utc == now_time_utc :
print ("Passed")
else :
print("Failed")