找到datetime.isocalendar()逆函数的最佳方法是什么?

发布于 2021-01-29 15:06:00

Pythondatetime.isocalendar()方法返回(ISO_year, ISO_week_number, ISO_weekday)给定datetime对象的元组。有相应的逆函数吗?如果不是,是否有一种简单的方法来计算给定的年份,星期数和星期几?

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    Python
    3.8添加了fromisocalendar()方法:

    >>> datetime.fromisocalendar(2011, 22, 1)
    datetime.datetime(2011, 5, 30, 0, 0)
    

    Python的3.6添加的%G%V%u指示

    >>> datetime.strptime('2011 22 1', '%G %V %u')
    datetime.datetime(2011, 5, 30, 0, 0)
    

    原始答案

    我最近不得不自己解决此问题,并提出了以下解决方案:

    import datetime
    
    def iso_year_start(iso_year):
        "The gregorian calendar date of the first day of the given ISO year"
        fourth_jan = datetime.date(iso_year, 1, 4)
        delta = datetime.timedelta(fourth_jan.isoweekday()-1)
        return fourth_jan - delta
    
    def iso_to_gregorian(iso_year, iso_week, iso_day):
        "Gregorian calendar date for the given ISO year, week and day"
        year_start = iso_year_start(iso_year)
        return year_start + datetime.timedelta(days=iso_day-1, weeks=iso_week-1)
    

    一些测试用例:

    >>> iso = datetime.date(2005, 1, 1).isocalendar()
    >>> iso
    (2004, 53, 6)
    >>> iso_to_gregorian(*iso)
    datetime.date(2005, 1, 1)
    
    >>> iso = datetime.date(2010, 1, 4).isocalendar()    
    >>> iso
    (2010, 1, 1)
    >>> iso_to_gregorian(*iso)
    datetime.date(2010, 1, 4)
    
    >>> iso = datetime.date(2010, 1, 3).isocalendar()
    >>> iso
    (2009, 53, 7)
    >>> iso_to_gregorian(*iso)
    datetime.date(2010, 1, 3)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看