3

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

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

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

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

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

4

3 回答 3

10

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) 以来经过的 100 纳秒间隔数”告诉我使用:

>>> 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
于 2012-08-14T07:02:25.220 回答
2

似乎是Windows 文件时间

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

另请参见FILETIME 结构

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

对于 UTC 案例(适应 C++ 答案):

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

于 2012-08-14T10:18:52.710 回答
1

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

于 2012-08-14T07:23:00.350 回答