【问题标题】:Conversion of unix epoch time to windows epoch time in python在python中将unix纪元时间转换为Windows纪元时间
【发布时间】:2012-01-30 00:48:39
【问题描述】:

快速提问: 是否有 pythonic(无论是否在标准库中)方法将 unix 32 位纪元时间转换为 Windows 64 位纪元时间并再次转换回来?

【问题讨论】:

    标签: python windows unix datetime epoch


    【解决方案1】:

    您可以将 POSIX 时间戳转换为 datetime

    >>> tstamp = 1325178061  # right about now
    >>> from datetime import datetime
    >>> datetime.fromtimestamp(tstamp)
    datetime.datetime(2011, 12, 29, 18, 1, 1)
    

    fromtimestamp 命名构造函数接受所有平台上的 POSIX 时间戳 (!)。

    转换为 Windows 时间戳只需减去 Windows 纪元(Wikipedia says 是 1601 年 1 月 1 日),然后将生成的 timedelta 转换为秒数:

    >>> W_EPOCH = datetime(1601, 1, 1)
    >>> (datetime.fromtimestamp(tstamp) - W_EPOCH).total_seconds()
    12969655261.0
    

    现在您已经有了一个 float,您可以将其转换为 int 并以您喜欢的任何方式存储为 64 位数量。

    【讨论】:

    • 如果我们必须转换为 Win32 FILETIME 格式以外的格式(但我同意几乎可以肯定这就是 OP 想要的),那会很有趣,因为 MS 在时间格式方面很有创意。 See here 获取列表。只是希望你永远不必使用 OLE 时代哦
    • 这很好,但是关于这个的一件事是我在 2.6.5 上,并且没有 total_seconds 调用....
    • 另外,Voo,我确实在使用 FILETIME 格式...只是为了确认,我需要将这些秒数转换为 10^-7 秒,对吗?
    • @user - 是的,这些是自 1601 年 1 月 1 日以来的 100 纳秒“增量”。这也是 COBOL 的纪元时间为零。也许是 MS 从 MS COBOL 计划中得到这个想法的地方。
    【解决方案2】:

    从 Windows EPOCH 时间戳转换为 datetime 对象(但不是相反);这是我想出的解决方案:

    from datetime import datetime, timezone
    def convert_from(windows_timestamp: int) -> datetime:
        unix_epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
        windows_epoch = datetime(1601, 1, 1, tzinfo=timezone.utc)
        epoch_delta = unix_epoch - windows_epoch
        windows_timestamp_in_seconds = windows_timestamp / 10_000_000
        unix_timestamp = windows_timestamp_in_seconds - epoch_delta.total_seconds()
    
        return datetime.utcfromtimestamp(unix_timestamp)
    

    这允许您按原样传递 Windows 时间戳,它会输出一个有效的 Python datetime 对象。

    注意:这是 Python 3 特有的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-08
      • 2016-01-21
      • 2015-12-22
      • 1970-01-01
      • 2014-05-03
      • 2018-10-01
      • 2023-03-27
      • 2014-04-07
      相关资源
      最近更新 更多