【问题标题】:Creating a datetime object by only providing the month or only providing the day of the week通过仅提供月份或仅提供星期几来创建日期时间对象
【发布时间】:2021-02-08 18:51:40
【问题描述】:

在 Python 中通过仅提供月份来创建 datetime 对象会保留月份信息:

>>> import datetime
>>> datetime.datetime.strptime('Feb', '%b')
datetime.datetime(1900, 2, 1, 0, 0)
>>> datetime.datetime.strptime('Feb', '%b').strftime('%B')
'February'

由于没有提供年份或日期,Python 分别使用默认值 1900 和 01,从而生成 datetime.datetime(1900, 2, 1, 0, 0)

但是,如果提供一周中的某一天:

>>> datetime.datetime.strptime('Tue', '%a')
datetime.datetime(1900, 1, 1, 0, 0)
>>> datetime.datetime.strptime('Tue', '%a').strftime('%A')
'Monday'

我知道1900-01-01 是星期一,但为什么 Python 不创建一个对象 datetime.datetime(1900, 1, 2, 0, 0),它是在 1900-01-01 之后的第一个星期二,类似于第一个示例中的二月?

似乎最初的信息(即那一天是星期二)在没有任何警告或错误的情况下丢失了。通过仅提供月份和仅提供星期几来创建 datetime 对象有根本区别吗?

【问题讨论】:

  • 我相信,datetime 存储年、月、日和时间字段。而一周中的哪一天是按需计算的。但这不是您问题的答案
  • @Yevhen 你是对的,我想这就是datetime.datetime.strptime('', '') 工作并导致datetime.datetime(1900, 1, 1, 0, 0) 的原因。但我希望有某种 ValueError 之类的 "Tue" cannot be used,因为它基本上删除了原始信息。

标签: python python-3.x date datetime


【解决方案1】:

根据docs

对于datetime.strptime() 类方法,默认值为1900-01-01T00:00:00.000:格式字符串中未指定的任何组件都将从默认值中提取。

还有重要的部分:

与 %U 和 %W 类似,%V 仅用于计算 星期和 ISO 年 (%G) 以 strptime() 格式指定 细绳。另请注意,%G 和 %Y 不可互换。

我猜%a 属于相同条件,但未在文档中指定。

您可以使用%G(ISO 8601 年)和%V(ISO 8601 周)以及%a,那么它应该可以工作:

>>> datetime.datetime.strptime('1900 01 Tue', '%G %V %a').strftime('%Y-%m-%d %a')
'1900-01-02 Tue'

>>> datetime.datetime.strptime('1900 02 Tue', '%G %V %a').strftime('%Y-%m-%d %a')
'1900-01-09 Tue'

我相信这是因为您可以通过这种方式指定所需的星期。

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 2021-05-19
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多