将datetime转换为unix时间戳

时间:2012-07-19 05:19:11

标签: python datetime unix-timestamp

今天我和一些同事试图将日期时间正确转换为非本地时区的时间戳。经过多次讨论,我们仍然不确定如何在一般意义上正确地将日期时间转换为时间戳,并且只是部分确定如何为我们的用例执行此操作:America / New_York中的日期时间实例来自pytz的时区。

所以,我想我会经历一些排列,并尝试凭经验弄清楚,因为阅读文档并尝试逻辑推理它并没有把我带到任何地方。

这是输入数据:

pst = pytz.timezone('America/Los_Angeles')
est = pytz.timezone('America/New_York')
utc = pytz.timezone('UTC')

epoch = int(time.time())
# local time for me is Pacific
local_naive = datetime.datetime.fromtimestamp(epoch)
local_aware = datetime.datetime.fromtimestamp(epoch, pst)
est_aware = datetime.datetime.fromtimestamp(epoch, est)
utc_naive = datetime.datetime.utcfromtimestamp(epoch)
utc_aware = datetime.datetime.fromtimestamp(epoch, utc)

结果以四种方式计算:

  1. time.mktime(dt.timetuple())
  2. time.mktime(dt.utctimetuple())
  3. calendar.timegm(dt.timetuple())
  4. calendar.timegm(dt.utctimetuple())
  5. 我意识到其中一些本质上是荒谬的,但我试图完成:)。

    这是输出。 diff=部分旨在帮助显示不正确的转化。

    now epoch                       : 1342671099
    est   aware mktime(timetuple)   : 1342681899 diff=-10800
    local aware mktime(timetuple)   : 1342671099 diff=0
    local naive mktime(timetuple)   : 1342671099 diff=0
    utc   aware mktime(timetuple)   : 1342699899 diff=-28800
    utc   naive mktime(timetuple)   : 1342696299 diff=-25200
    est   aware mktime(utctimetuple): 1342699899 diff=-28800
    local aware mktime(utctimetuple): 1342699899 diff=-28800
    local naive mktime(utctimetuple): 1342674699 diff=-3600
    utc   aware mktime(utctimetuple): 1342699899 diff=-28800
    utc   naive mktime(utctimetuple): 1342699899 diff=-28800
    est   aware timegm(timetuple)   : 1342656699 diff=14400
    local aware timegm(timetuple)   : 1342645899 diff=25200
    local naive timegm(timetuple)   : 1342645899 diff=25200
    utc   aware timegm(timetuple)   : 1342671099 diff=0
    utc   naive timegm(timetuple)   : 1342671099 diff=0
    est   aware timegm(utctimetuple): 1342671099 diff=0
    local aware timegm(utctimetuple): 1342671099 diff=0
    local naive timegm(utctimetuple): 1342645899 diff=25200
    utc   aware timegm(utctimetuple): 1342671099 diff=0
    utc   naive timegm(utctimetuple): 1342671099 diff=0
    

    从我从这个输出中可以看出,一般来说,调用calendar.timegm(dt.utctimetuple())通常是正确的方式 - 除非它是一个天真的本地时间。好吧,我可以解决这个问题...除了我没有看到你如何能够消除当地天真时间与任何其他天真时间的歧义,这使得无法正确地将任意日期时间对象转换为时间戳?是真的如此,还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

  

我不知道如何消除当地幼稚时间与任何其他天真时间的歧义

完全。正如您所知,天真意味着“没有附加时区信息”,因此timegm被迫推断缺失的信息,而您的结果表明它将天真的日期时间推断为UTC。

正如在评论中所说的那样,附加TZ的时间应该被视为烫手山芋 - 您应该在获得输入后立即转换为UTC,并在输出到用户之前转换为本地。从长远来看,这将为您节省很多心痛。