Pythonic difference between two dates in years?

后端 未结 12 2516
醉酒成梦
醉酒成梦 2020-12-02 16:21

Is there a more efficient way of doing this below? I want to have the difference in years between two dates as a single scalar. Any suggestions are welcome.

         


        
12条回答
  •  忘掉有多难
    2020-12-02 17:01

    More robust function - calculates difference in years (age) and days:

    def get_diff_in_years_and_days(from_date, to_date):
        try:
            from_in_this_year = date(to_date.year, from_date.month, from_date.day)
        except:
            from_in_this_year = date(to_date.year, from_date.month, from_date.day-1) # today is feb in leap year
    
        if from_in_this_year <= to_date:
            years = to_date.year - from_date.year
            days = (to_date - from_in_this_year).days
        else:
            years = to_date.year - from_date.year - 1
            try:
                from_in_prev_year = date(to_date.year-1, from_date.month, from_date.day)
            except:
                from_in_prev_year = date(to_date.year-1, from_date.month, from_date.day-1) # today is feb in leap year
            days = (to_date - from_in_prev_year).days
    
        assert days>=0 and days<=365, days
        assert years>=0, years
    
        return years, days
    

    some unit-tests:

    self.assertEqual((0,  0), get_diff_in_years_and_days(date(2018,1, 1), date(2018,1, 1)))
    self.assertEqual((1,  0), get_diff_in_years_and_days(date(2017,1, 1), date(2018,1, 1)))
    self.assertEqual((1,  1), get_diff_in_years_and_days(date(2017,1, 1), date(2018,1, 2)))
    self.assertEqual((2,  0), get_diff_in_years_and_days(date(2016,2,29), date(2018,2,28)))
    self.assertEqual((2,  1), get_diff_in_years_and_days(date(2014,2,28), date(2016,2,29)))
    self.assertEqual((1,364), get_diff_in_years_and_days(date(2014,2,28), date(2016, 2,27)))
    self.assertEqual((3,30) , get_diff_in_years_and_days(date(2015,10,1), date(2018,10,31)))
    self.assertEqual((10,30), get_diff_in_years_and_days(date(2010,10,1), date(2020,10,31)))
    self.assertEqual((3,31) , get_diff_in_years_and_days(date(2015,10,1), date(2018,11, 1)))
    self.assertEqual((2,364), get_diff_in_years_and_days(date(2015,10,1), date(2018, 9,30)))
    

提交回复
热议问题