所以我有两个函数可以将python datetime.datetime()对象转换为毫秒和毫秒。我不知道哪里出了问题。以下是我的工作内容:
>>> import datetime
>>> def mil_to_date(mil):
"""date items from REST services are reported in milliseconds,
this function will convert milliseconds to datetime objects
Required:
mil -- time in milliseconds
"""
if mil == None:
return None
elif mil < 0:
return datetime.datetime.utcfromtimestamp(0) + datetime.timedelta(seconds=(mil/1000))
else:
return datetime.datetime.fromtimestamp(mil / 1000)
>>> def date_to_mil(date):
"""converts datetime.datetime() object to milliseconds
date -- datetime.datetime() object"""
if isinstance(date, datetime.datetime):
epoch = datetime.datetime.utcfromtimestamp(0)
return long((date - epoch).total_seconds() * 1000.0)
>>> mil = 1394462888000
>>> date = mil_to_date(mil)
>>> date
datetime.datetime(2014, 3, 10, 9, 48, 8) #this is correct
>>> d2m = date_to_mil(date)
>>> d2m
1394444888000L
>>> mil
1394462888000L
>>> date2 = mil_to_date(d2m)
>>> date2
datetime.datetime(2014, 3, 10, 4, 48, 8) #why did I lose 5 hours??
因为某种原因,我损失了5个小时。我忽略了一些明显的东西吗?还是我的一个或两个功能都有问题?
这是因为fromtimestamp返回本地时间:"如果可选参数tz为none或未指定,则将时间戳转换为平台的本地日期和时间,并且返回的date time对象是幼稚的。"
无关:timedelta(milliseconds=mil)作品。
相关:在python中获取以毫秒为单位的当前时间?
无关:即使结果是long,也可以使用int(2**300)。
1394462888000 != 1394444888000
原因是date_to_mil与UTC工作,mil_to_date不工作,你应该用fromtimestamp代替utcfromtimestamp。
进一步解释:
在您的代码中,epoch是以UTC表示的纪元日期(但对象没有任何时区)。但是date是本地的,因为fromtimestamp返回一个本地时间:
If optional argument tz is None or not specified, the timestamp is
converted to the platform’s local date and time, and the returned
datetime object is naive
因此,从本地日期时间中减去UTC时间,得到一个延迟,它是到UTC的本地延迟。
哦,哇,我错过了一些明显的东西!我应该把两者都当作UTC来对待。我没有注意到,我对历代之后所有日期的else语句都没有使用.utcfromtimestamp()方法。谢谢!
@crmackey:应该强调的是,从本地日期时间中减去UTC时间,就像从千克中减去磅——结果是没有意义的(应该从UTC时间中减去UTC时间)。如果本地时区在过去有不同的UTC偏移量,那么对表示具有不同的UTC偏移量的本地时间的原始日期时间对象执行算术也是错误的。查看日期时间之间是否已过24小时)
如果输入为UTC,则以整数毫秒的形式获取POSIX时间戳:
from datetime import datetime, timedelta
def timestamp_millis(utc_time, epoch=datetime(1970, 1, 1)):
"""Return milliseconds since Epoch as integer."""
td = utc_time - epoch
return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) // 10**3
注:公式可能产生与:int(td.total_seconds() * 1000)不同的结果。
反过来:要从POSIX时间中获取UTC时间,以毫秒为单位:
def datetime_from_millis(millis, epoch=datetime(1970, 1, 1)):
"""Return UTC time that corresponds to milliseconds since Epoch."""
return epoch + timedelta(milliseconds=millis)
支持正、负millis。
注:None处理发生在这些功能之外。
例子:
>>> datetime_from_millis(1394462888000)
datetime.datetime(2014, 3, 10, 14, 48, 8)
>>> datetime.utcfromtimestamp(1394462888)
datetime.datetime(2014, 3, 10, 14, 48, 8)
>>> timestamp_millis(_)
1394462888000
结果与你问题中的结果不同!
忽略了gmtime(0).year != 1970和TZ=right/UTC案例。