【问题标题】:Convert Mac Timestamps with python使用 python 转换 Mac 时间戳
【发布时间】:2013-06-03 16:17:40
【问题描述】:

我正在尝试使用 python(在 linux 系统上)将 Mac OSX (HFS Plus) 时间戳转换为人类可读的格式。

HFS Plus 时间戳表示自 1904 年 1 月 1 日午夜以来的时间(以秒为单位)。

例如时间戳:3453120824

人类日期时间:2013 年 6 月 3 日星期一 16:13:44 GMT

有没有 python 方法可以做到这一点?

【问题讨论】:

  • 如果您可以为其添加 66 年的秒数,您可以将其视为普通的time.time() 电话。我相信 pythons time.time() 在做了一些快速数学运算后从 1970 年开始计算秒数。
  • 我的意思是减去 66 年哈哈***

标签: python macos datetime timestamp


【解决方案1】:

将datetime 与timedelta 一起使用怎么样?您需要特别注意格式化字符列表here

>>> import datetime
>>> d = datetime.datetime.strptime("01-01-1904", "%m-%d-%Y")
>>> d
datetime.datetime(1904, 1, 1, 0, 0)
>>> d + datetime.timedelta(seconds=3453120824)
datetime.datetime(2013, 6, 3, 16, 13, 44) 
>>> (d + datetime.timedelta(seconds=3453120824)).strftime("%a, %d %b %Y %H:%M:%S GMT")
'Mon, 03 Jun 2013 16:13:44 GMT'

【讨论】:

  • 这个答案很好,因为它解决了问题的难点,但 IMO 可以通过最后一步并展示如何以OP询问。
  • @MarkkuK。就在你评论的时候这样做了。
【解决方案2】:

您根本不需要日期时间。 Apple 从 2001-01-01 开始存储他们的时间。超级烦人但很容易克服。只需将 1970-01-01 和 2001-01-01 之间的差异(以秒为单位)添加到变量中,并使用 time 在一行代码中将其格式化:

import time
mac_date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(data[0]/1000000000 + 978307200))
print mac_date

在这个例子中,data[0] 是我对 chat.db 进行 sqlite 查询得到的日期,它是元组中的第一个字段。 978307200 是以秒为单位的 unix 纪元和 mac 时间戳之间的差异,并且永远不会改变。当您将这两者相加并转换 unix 纪元时,您会得到一个人类可读的日期。

*截至 High Sierra,chat.db file now uses nanoseconds. 这要求日期值除以 1000000000。

【讨论】:

  • 我试过你的方法,但总是要 12 个小时。你看到同样的结果了吗?我不得不调整:978350457 - 12 * 60 * 60
  • 是的,我必须使用 978307200
【解决方案3】:

您可以通过此方法将其他方式(日期时间对象转换为 MAC 绝对时间):

import datetime
dt = datetime.datetime(2013,6,3,16,13,44)
tmp = datetime.datetime(1904,1,1,0,0)
MacAbsTime = int((dt - tmp).total_seconds())

另请注意,iOS MAC 绝对时间与 OSX 版本不同,使用自 2001 年 1 月 1 日以来的秒数,而不是 1904 年。

【讨论】:

  • 您的答案会从 datetime 对象生成时间戳。问题是关于相反的方向:从时间戳获取日期时间对象。
  • 是的,但它对我很有用,可能对其他看这里的人有用
猜你喜欢
  • 1970-01-01
  • 2013-08-15
  • 2017-07-18
  • 1970-01-01
  • 2020-06-15
  • 2019-01-05
  • 2013-02-08
  • 2013-02-14
  • 2021-06-21
相关资源
最近更新 更多