我有dt = datetime(2013,9,1,11),我想获得这个datetime对象的Unix时间戳。
当我做(dt - datetime(1970,1,1)).total_seconds()时,我得到了时间戳1378033200。
当转换回使用datetime.fromtimestamp时,我得到了datetime。Datetime(2013, 9,1,6,0)。
时间不对。我错过了什么?
我有dt = datetime(2013,9,1,11),我想获得这个datetime对象的Unix时间戳。
当我做(dt - datetime(1970,1,1)).total_seconds()时,我得到了时间戳1378033200。
当转换回使用datetime.fromtimestamp时,我得到了datetime。Datetime(2013, 9,1,6,0)。
时间不对。我错过了什么?
当前回答
这个类将覆盖您的需求,您可以将变量传递到ConvertUnixToDatetime并调用您希望它基于哪个函数进行操作。
from datetime import datetime
import time
class ConvertUnixToDatetime:
def __init__(self, date):
self.date = date
# Convert unix to date object
def convert_unix(self):
unix = self.date
# Check if unix is a string or int & proceeds with correct conversion
if type(unix).__name__ == 'str':
unix = int(unix[0:10])
else:
unix = int(str(unix)[0:10])
date = datetime.utcfromtimestamp(unix).strftime('%Y-%m-%d %H:%M:%S')
return date
# Convert date to unix object
def convert_date(self):
date = self.date
# Check if datetime object or raise ValueError
if type(date).__name__ == 'datetime':
unixtime = int(time.mktime(date.timetuple()))
else:
raise ValueError('You are trying to pass a None Datetime object')
return type(unixtime).__name__, unixtime
if __name__ == '__main__':
# Test Date
date_test = ConvertUnixToDatetime(datetime.today())
date_test = date_test.convert_date()
print(date_test)
# Test Unix
unix_test = ConvertUnixToDatetime(date_test[1])
print(unix_test.convert_unix())
其他回答
当转换为unix时间戳时,python基本上是假设UTC,但在转换回来时,它会给你一个转换为本地时区的日期。
请看这个问题/答案; 获取datetime.datetime.fromtimestamp()使用的时区
解决方案是
import time
import datetime
d = datetime.date(2015,1,5)
unixtime = time.mktime(d.timetuple())
如果你想将python datetime转换为seconds since epoch,你应该显式地做:
>>> import datetime
>>> datetime.datetime(2012, 04, 01, 0, 0).strftime('%s')
'1333234800'
>>> (datetime.datetime(2012, 04, 01, 0, 0) - datetime.datetime(1970, 1, 1)).total_seconds()
1333238400.0
在Python 3.3+中,您可以使用timestamp()来代替:
>>> import datetime
>>> datetime.datetime(2012, 4, 1, 0, 0).timestamp()
1333234800.0
使用UTC时区:
time_stamp = calendar.timegm(dt.timetuple())
datetime.utcfromtimestamp(time_stamp)
如果datetime对象表示UTC时间,则不要使用time。Mktime,因为它假设元组在您的本地时区。相反,使用calendar.timegm:
>>> import datetime, calendar
>>> d = datetime.datetime(1970, 1, 1, 0, 1, 0)
>>> calendar.timegm(d.timetuple())
60