【问题标题】:An error occurs in Windows - OSError: [Errno 22] Invalid argument - datetimeWindows 中出现错误 - OSError: [Errno 22] Invalid argument - datetime
【发布时间】:2021-08-26 03:01:51
【问题描述】:

Windows 出现错误:

OSError: [Errno 22] 无效参数

虽然在 Linux 中一切正常

from datetime import datetime

a = datetime.fromtimestamp(0)
a.timestamp() # - an error occurs here

如何在 Windows 中解决此问题?

【问题讨论】:

  • 你的预期输出是什么?
  • 预期输出 - 0.0
  • 不,因为它没有提到 fromtimestamp。时间戳的问题源于使用 fromtimestamp(0) 创建的 datetime 对象
  • 对我最初的评论表示歉意,我认为这具有误导性。 this answer 基本上说“这是 Windows 的事情”和“不会发生在有意识的日期时间”(我可以重现)。但是:它没有提供关于 为什么 在 Windows 上发生这种情况的任何线索。无论如何,我的收获是:尽可能使用有意识的日期时间(最好是 UTC)

标签: windows datetime timestamp python-3.9


【解决方案1】:

除了我在 cmets 部分链接的答案中建议的解决方法之外,这里还有一些问题。在 Windows 10 上运行一些测试代码,

from datetime import datetime

i=0
while True:
    try:
        a = datetime.fromtimestamp(i).timestamp()
    except OSError:
        i += 1
        continue
    else:
        print(datetime.fromtimestamp(i).astimezone(), i)
        break
    
# prints 
# 1970-01-02 01:00:00+01:00 86400

我们可以观察到 datetime 构造函数 fromtimestamp 的工作原理与输入 >= 86400 秒(正好是一天)的预期相同。

通过查看src,我们可以了解到time.localtime(原始日期时间)或time.gmtime(知道日期时间/UTC)用于从Unix时间输入(即然后用于生成日期时间对象)。两种方法都可以单独使用:

import time
print(time.localtime(0), time.gmtime(0))
# prints
# time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0) 
# time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

所以问题仍然存在:为什么 datetime 构造函数在 Unix 纪元之后在 Windows 上死了一天?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2020-03-30
    • 2015-12-09
    • 2020-07-29
    • 2019-06-29
    相关资源
    最近更新 更多