Python日期格式?

3

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

问题是我不知道这个日期的格式是什么:

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

这是既包含日期又包含时间的格式,希望有人能够识别它所属的格式,因为我不太懂Python。如果您能向我展示如何将其转换为Unix时间戳,则会获得额外的奖励分。

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


你的意思是129893678626216000应该解码为2012年8月13日14:44:22,而你正在尝试找到解码算法? - Vasiliy Faronov
是的,正是因为这个原因,我知道它不是Unix时间戳的变体。 - Jess
你有输出它的程序的源代码吗?如果没有,你能提示一下那个程序是什么吗?我不知道,但这可能是某个特定领域的约定或其他什么东西。 - Vasiliy Faronov
当然,抱歉我认为这不会有帮助,因为它是一个已编译的dll文件,但我对Python并不了解,它可能是可反编译的。这是Foobar2000的一个组件 - http://www.foobar2000.org/components/view/foo_playcount。XML导出使用了奇怪的日期/时间戳编码。 - Jess
另外,它在某个地方说它使用了64位文件时间,“文件时间是一个64位的值,表示自协调世界时(UTC)1601年1月1日上午12:00以来经过的100纳秒间隔数”,但我不知道那是什么(不是Python专家)。 - Jess
3个回答

11

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)

编辑: 然而,您提供的信息"A file time is a 64-bit value that represents the number of 100-nanosecond intervals that have elapsed since 12:00 A.M. January 1, 1601 Coordinated Universal Time (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

2
似乎是Windows文件时间:
一个文件时间是一个64位的值,表示自协调世界时(UTC)1601年1月1日12:00 AM以来经过的100纳秒间隔的数量。当应用程序创建、访问和写入文件时,系统记录文件时间。NTFS文件系统以UTC格式存储时间值,因此它们不受时区或夏令时更改的影响。FAT文件系统根据计算机的本地时间存储时间值。例如,在NTFS卷上保存在华盛顿的下午3:00 PST的文件在纽约被视为下午6:00 EST,但在FAT卷上,它被视为下午3:00 EST。
另请参见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(可能是太平洋夏令时),看起来与您的问题所涉及的时间相符。

要处理过去本地时区(来自FAT)中的文件时间的夏令时,您可能需要使用pytz库


1
一切都很美好,文件时间(filetime)类似于Unix时间戳,但是它是从1601年1月1日上午12:00开始计算的。因此,减去正确的秒数并将其除以秒数即可得到Unix时间戳。请尝试以下代码:(FILETIME - 116444736000000000) / 10000000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接