Python将毫秒转换为日期时间并返回

crm*_*key 3 python datetime python-2.7

因此,我有两个函数可以将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??
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我损失了5个小时。我是否忽略了明显的东西?还是我的一个或两个功能有问题?

Ell*_*ski 5

这样做的原因是date_to_mil可以使用UTCmil_to_date不能使用。您应该替换utcfromtimestampfromtimestamp

进一步说明:

在您的代码中,epoch是UTC的纪元日期(但对象没有任何时区)。但是date是本地的,因为fromtimestamp返回本地时间:

如果可选参数tz为None或未指定,则时间戳将转换为平台的本地日期和时间,并且返回的datetime对象是天真的

因此,您从本地日期时间中减去UTC时期,您会得到一个延迟,这就是您对UTC的本地延迟。