Add one year in current date PYTHON

后端 未结 8 1439
别跟我提以往
别跟我提以往 2020-11-29 01:59

I have fetched a date from database with the following variable

{{ i.operation_date }}

相关标签:
8条回答
  • 2020-11-29 02:31

    This is what I do when I need to add months or years and don't want to import more libraries. Just create a datetime.date() object, call add_month(date) to add a month and add_year(date) to add a year.

    import datetime
    __author__ = 'Daniel Margarido'
    
    
    # Check if the int given year is a leap year
    # return true if leap year or false otherwise
    def is_leap_year(year):
        if (year % 4) == 0:
            if (year % 100) == 0:
                if (year % 400) == 0:
                    return True
                else:
                    return False
            else:
                return True
        else:
            return False
    
    
    THIRTY_DAYS_MONTHS = [4, 6, 9, 11]
    THIRTYONE_DAYS_MONTHS = [1, 3, 5, 7, 8, 10, 12]
    
    # Inputs -> month, year Booth integers
    # Return the number of days of the given month
    def get_month_days(month, year):
        if month in THIRTY_DAYS_MONTHS:   # April, June, September, November
            return 30
        elif month in THIRTYONE_DAYS_MONTHS:   # January, March, May, July, August, October, December
            return 31
        else:   # February
            if is_leap_year(year):
                return 29
            else:
                return 28
    
    # Checks the month of the given date
    # Selects the number of days it needs to add one month
    # return the date with one month added
    def add_month(date):
        current_month_days = get_month_days(date.month, date.year)
        next_month_days = get_month_days(date.month + 1, date.year)
    
        delta = datetime.timedelta(days=current_month_days)
        if date.day > next_month_days:
            delta = delta - datetime.timedelta(days=(date.day - next_month_days) - 1)
    
        return date + delta
    
    
    def add_year(date):
        if is_leap_year(date.year):
            delta = datetime.timedelta(days=366)
        else:
            delta = datetime.timedelta(days=365)
    
        return date + delta
    
    
    # Validates if the expected_value is equal to the given value
    def test_equal(expected_value, value):
        if expected_value == value:
            print "Test Passed"
            return True
    
        print "Test Failed : " + str(expected_value) + " is not equal to " str(value)
        return False
    
    # Test leap year
    print "---------- Test leap year ----------"
    test_equal(True, is_leap_year(2012))
    test_equal(True, is_leap_year(2000))
    test_equal(False, is_leap_year(1900))
    test_equal(False, is_leap_year(2002))
    test_equal(False, is_leap_year(2100))
    test_equal(True, is_leap_year(2400))
    test_equal(True, is_leap_year(2016))
    
    # Test add month
    print "---------- Test add month ----------"
    test_equal(datetime.date(2016, 2, 1), add_month(datetime.date(2016, 1, 1)))
    test_equal(datetime.date(2016, 6, 16), add_month(datetime.date(2016, 5, 16)))
    test_equal(datetime.date(2016, 3, 15), add_month(datetime.date(2016, 2, 15)))
    test_equal(datetime.date(2017, 1, 12), add_month(datetime.date(2016, 12, 12)))
    test_equal(datetime.date(2016, 3, 1), add_month(datetime.date(2016, 1, 31)))
    test_equal(datetime.date(2015, 3, 1), add_month(datetime.date(2015, 1, 31)))
    test_equal(datetime.date(2016, 3, 1), add_month(datetime.date(2016, 1, 30)))
    test_equal(datetime.date(2016, 4, 30), add_month(datetime.date(2016, 3, 30)))
    test_equal(datetime.date(2016, 5, 1), add_month(datetime.date(2016, 3, 31)))
    
    # Test add year
    print "---------- Test add year ----------"
    test_equal(datetime.date(2016, 2, 2), add_year(datetime.date(2015, 2, 2)))
    test_equal(datetime.date(2001, 2, 2), add_year(datetime.date(2000, 2, 2)))
    test_equal(datetime.date(2100, 2, 2), add_year(datetime.date(2099, 2, 2)))
    test_equal(datetime.date(2101, 2, 2), add_year(datetime.date(2100, 2, 2)))
    test_equal(datetime.date(2401, 2, 2), add_year(datetime.date(2400, 2, 2)))
    
    0 讨论(0)
  • 2020-11-29 02:32

    You can use Python-dateutil's relativedelta to increment a datetime object while remaining sensitive to things like leap years and month lengths. Python-dateutil comes packaged with matplotlib if you already have that. You can do the following:

    from dateutil.relativedelta import relativedelta
    
    new_date = old_date + relativedelta(years=1)
    

    (This answer was given by @Max to a similar question).

    But if your date is a string (i.e. not already a datetime object) you can convert it using datetime:

    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    
    your_date_string = "April 1, 2012"
    format_string = "%B %d, %Y"
    
    datetime_object = datetime.strptime(your_date_string, format_string).date()
    new_date = datetime_object + relativedelta(years=1)
    new_date_string = datetime.strftime(new_date, format_string).replace(' 0', ' ')
    

    new_date_string will contain "April 1, 2013".

    NB: Unfortunately, datetime only outputs day values as "decimal numbers" - i.e. with leading zeros if they're single digit numbers. The .replace() at the end is a workaround to deal with this issue copied from @Alex Martelli (see this question for his and other approaches to this problem).

    0 讨论(0)
提交回复
热议问题