【问题标题】:Python date format?Python日期格式?
【发布时间】:2012-08-10 10:43:18
【问题描述】:

我真的希望你能帮我解决这个问题。我有一个 python 程序输出的日期,我需要能够在另一个程序中访问它。

问题是我不知道这个日期是如何格式化的:

Format               Date
129893779638930000 - 2012-08-13 17:32:43

它既是日期又是时间,我真的希望有人能认出它的格式,因为我不太了解 python。如果您能告诉我如何将其转换为 unix 时间戳,则可以加分。

编辑: 执行此操作的程序是 Foobar2000 的一个组件(音乐程序的扩展)。该组件显示在这里:http://www.foobar2000.org/components/view/foo_playcount,它是生成奇数日期/时间戳的 XML 导出功能。

【问题讨论】:

  • 你的意思是129893678626216000应该解码到2012-08-13 14:44:22,你在找解码算法吗?
  • 是的,没错,这就是为什么我知道它不是 unix 时间戳的变体。
  • 你有输出它的程序的源代码吗?如果没有,你能至少暗示一下那个程序是什么吗?我不知道,但这可能是特定领域的约定之类的。
  • 当然,对不起,我不认为它是一个编译的 dll 会有帮助,但我对 python 了解不多,它可能是可反编译的。它是 Foobar2000 - foobar2000.org/components/view/foo_playcount 的一个组件。 XML 导出使用日期/时间戳的奇数编码
  • 另一件事,它在某处说它使用 64 位文件时间“文件时间是一个 64 位值,表示自 1 月 1 日凌晨 12:00 以来经过的 100 纳秒间隔数, 1601 协调世界时 (UTC)”,但我不知道那是什么(不是 python 人)

标签: python date


【解决方案1】:

好像Windows file time:

文件时间是一个 64 位值,表示 自凌晨 12:00 以来经过的 100 纳秒间隔1月1日, 1601 协调世界时 (UTC)。系统记录文件时间 当应用程序创建、访问和写入文件时。 NTFS 文件 系统以 UTC 格式存储时间值,因此它们不受 时区或夏令时的变化。 FAT文件系统 根据计算机的本地时间存储时间值。为了 例如,在华盛顿太平洋标准时间下午 3:00 保存的文件被视为 纽约东部标准时间下午 6:00 在 NTFS 卷上,但它被视为东部标准时间下午 3:00 在纽约的 FAT 卷上。

另见FILETIME Structure

重要的是时间可能同时采用 UTC 和本地时区。如果可能有 FAT 文件系统;检查插件是否直接从磁盘读取文件时间而不进行任何转换,以确定您是否需要考虑本地时区。

对于 UTC 情况 (adapting C++ answer):

WINDOWS_TICK_INTERVAL  = 100e-9 # 100 nanoseconds intervals
SEC_TO_UNIX_EPOCH = (datetime(1970, 1, 1) - datetime(1601, 1, 1)).total_seconds()
# -> 11644473600

def WindowsTickToUnixSeconds(windowsTicks):
    return windowsTicks * WINDOWS_TICK_INTERVAL - SEC_TO_UNIX_EPOCH

将其转换为datetime 对象:

from datetime import datetime

filetime = 129893779638930000
dt = datetime.utcfromtimestamp(WindowsTickToUnixSeconds(filetime))
print(dt.strftime("%Y-%m-%d %H:%M:%S.%f-00:00"))
# -> 2012-08-14 00:32:43.893000-00:00

它似乎与您问题中的时间相对应:2012-08-13 17:32:43-07:00(可能是 PDT)。

要处理过去本地时区(来自 FAT)中文件时间的 DST,您可能需要 pytz library

【讨论】:

    【解决方案2】:

    129893678626216000 看起来像 1e-8 秒(数十纳秒)内的 unix 时间戳:1,298,936,786.262,160,00。它代表:

    >>> from datetime import datetime
    >>> datetime.utcfromtimestamp(129893678626216000/1e8)
    datetime.datetime(2011, 2, 28, 23, 46, 26, 262160)
    

    编辑: 但是,您的信息“文件时间是一个 64 位值,表示自 1601 年 1 月 1 日上午 12:00 协调世界时 ( UTC)”告诉我使用:

    >>> from datetime import datetime, timedelta
    >>> datetime(1601, 1, 1, 0, 0, 0) + timedelta(seconds = 129893678626216000/1e7)
    datetime.datetime(2012, 8, 13, 21, 44, 22, 621599)
    

    在哪里得到你所期待的。

    您也可以直接将其转换为 unix 时间戳(自 1970-01-01 00:00:00 UTC 以来的秒数):

    >>> 129893678626216000 / 1e7 - 11644473600
    1344894262.6215992
    

    【讨论】:

      【解决方案3】:

      所有人都对这个世界感到满意,文件时间就像一个 unix 时间戳,但从凌晨 12:00 开始测量。 1601 年 1 月 1 日,因此减去正确的秒数并除以秒即可得到一个 unix 时间戳,试试这个:(FILETIME - 116444736000000000) / 10000000

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 2016-03-06
        • 2020-07-25
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多