【问题标题】:Default "future" year when effecting date conversion with dateutil使用 dateutil 进行日期转换时的默认“未来”年份
【发布时间】:2012-04-12 19:06:40
【问题描述】:

以下日期模式

1st January
30th April

很容易通过dateutil.parser.parse()解析成datetime.date的实例:

In [1]:from dateutil.parser import parse

In [2]: parse('1st January')
Out[2]: datetime.datetime(2012, 1, 1, 0, 0)

In [3]: parse('8th April')
Out[3]: datetime.datetime(2012, 4, 30, 0, 0)

如何从解析中返回未来日期?

即解析 '1st January' 将返回 datetime.datetime(2013, 1, 1, 0, 0),2013 年 1 月 1 日而不是 2012 年 1 月 1 日。任何优雅的解决方案?

【问题讨论】:

    标签: python python-datetime python-dateutil


    【解决方案1】:

    mensi's excellent answer to your previous question 开始,这里有一个解决方案,它采用没有指定年份的日期,并确保它们不是过去的。如果年份作为字符串的一部分给出,则保持不变。

    import datetime
    import dateutil
    
    def parse(date_string):
        result = dateutil.parser.parse(date_string, default=datetime.datetime(1581, 1, 1))
        if result.year == 1581:
            now = datetime.datetime.now()
            result = result.replace(year=now.year)
            if result < now:
                result = result.replace(year=now.year + 1)
        return result
    
    parse('8th April')
    

    【讨论】:

    • 谢谢!但是现在它不起作用。 dateutil.parse 不起作用,所以我通过from dateutil.parser import parse 导入parse 并将您的方法parse 重命名为parse_future。让它运行的简单步骤,但是一旦运行它就会返回datetime.datetime(1581, 4, 8, 0, 0)
    • @JosvicZammit,我想我修好了。
    • 我正在调试。 result.replace(year=now.year + 1) 是不工作的部分。
    • 问题是,即使“4 月 28 日”到了 2013 年,而我希望它保持不变。处理它,将编辑您的答案,如果您同意,请批准。干杯!
    • @JosvicZammit, replace 不会改变日期时间,它会返回一个新的日期时间 - 这是我最初犯的大错误。我不知道为什么我更新后的代码在“4 月 28 日”不起作用,您是否准确复制了它?
    猜你喜欢
    • 2018-05-10
    • 2021-12-01
    • 2019-08-12
    • 1970-01-01
    • 2017-12-25
    • 2015-02-07
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多