python 将毫秒转换成日期_Python将毫秒转换为datetime并返回

所以我有两个函数可以将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案例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值