Come incrementare data e ora di un giorno?

Come incrementare il giorno del datetime?

for i in range(1, 35)
    date = datetime.datetime(2003, 8, i)
    print(date)

Ma ho bisogno di passare attraverso mesi e anni correttamente? Tutte le idee?

InformationsquelleAutor Pol | 2010-07-13

 

4 Replies
  1. 202
    date = datetime.datetime(2003,8,1,12,4,5)
    for i in range(5): 
        date += datetime.timedelta(days=1)
        print(date) 
    • Se avete bisogno di prendere in considerazione l’ora legale; è più complesso, ad esempio, vedere Come posso sottrarre un giorno da una certa data?
    • non funziona per 06/30 + 1giorno => 06/31 deve essere 07/01 !!!
    • funziona come un fascino…anche per 06/30.
  2. 7

    Qui è un altro metodo per aggiungere giorni sulla data di utilizzo dateutil del relativedelta.

    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    
    print 'Today: ',datetime.now().strftime('%d/%m/%Y %H:%M:%S') 
    date_after_month = datetime.now()+ relativedelta(day=1)
    print 'After a Days:', date_after_month.strftime('%d/%m/%Y %H:%M:%S')

    Di uscita:

    Oggi: 25/06/2015 20:41:44

    Dopo Giorni: 01/06/2015 20:41:44

    • perché si usa al posto del timedelta() da stdlib?
    • Solo per condividere un altro possibile modo possibile di aggiungere un giorno.
    • Se non c’è nessun vantaggio, non credo che aggiunge valore.
  3. 7

    Tutte le risposte date sono sbagliate, in alcuni casi, come non considerare che fusi orari cambiare il loro offset rispetto all’ora UTC. In alcuni casi l’aggiunta di 24 ore è diverso dall’aggiunta di un giorno di calendario.

    Soluzione proposta

    La seguente soluzione funziona per Samoa e mantiene il locale costante di tempo.

    def add_day(today):
        """
        Add a day to the current day.
    
        This takes care of historic offset changes and DST.
    
        Parameters
        ----------
        today : timezone-aware datetime object
    
        Returns
        -------
        tomorrow : timezone-aware datetime object
        """
        today_utc = today.astimezone(datetime.timezone.utc)
        tz = today.tzinfo
        tomorrow_utc = today_utc + datetime.timedelta(days=1)
        tomorrow_utc_tz = tomorrow_utc.astimezone(tz)
        tomorrow_utc_tz = tomorrow_utc_tz.replace(hour=today.hour,
                                                  minute=today.minute,
                                                  second=today.second)
        return tomorrow_utc_tz

    Codice Testato

    # core modules
    import datetime
    
    # 3rd party modules
    import pytz
    
    
    # add_day methods
    def add_day(today):
        """
        Add a day to the current day.
    
        This takes care of historic offset changes and DST.
    
        Parameters
        ----------
        today : timezone-aware datetime object
    
        Returns
        -------
        tomorrow : timezone-aware datetime object
        """
        today_utc = today.astimezone(datetime.timezone.utc)
        tz = today.tzinfo
        tomorrow_utc = today_utc + datetime.timedelta(days=1)
        tomorrow_utc_tz = tomorrow_utc.astimezone(tz)
        tomorrow_utc_tz = tomorrow_utc_tz.replace(hour=today.hour,
                                                  minute=today.minute,
                                                  second=today.second)
        return tomorrow_utc_tz
    
    
    def add_day_datetime_timedelta_conversion(today):
        # Correct for Samoa, but dst shift
        today_utc = today.astimezone(datetime.timezone.utc)
        tz = today.tzinfo
        tomorrow_utc = today_utc + datetime.timedelta(days=1)
        tomorrow_utc_tz = tomorrow_utc.astimezone(tz)
        return tomorrow_utc_tz
    
    
    def add_day_dateutil_relativedelta(today):
        # WRONG!
        from dateutil.relativedelta import relativedelta
        return today + relativedelta(days=1)
    
    
    def add_day_datetime_timedelta(today):
        # WRONG!
        return today + datetime.timedelta(days=1)
    
    
    # Test cases
    def test_samoa(add_day):
        """
        Test if add_day properly increases the calendar day for Samoa.
    
        Due to economic considerations, Samoa went from 2011-12-30 10:00-11:00
        to 2011-12-30 10:00+13:00. Hence the country skipped 2011-12-30 in its
        local time.
    
        See https://stackoverflow.com/q/52084423/562769
    
        A common wrong result here is 2011-12-30T23:59:00-10:00. This date never
        happened in Samoa.
        """
        tz = pytz.timezone('Pacific/Apia')
        today_utc = datetime.datetime(2011, 12, 30, 9, 59,
                                      tzinfo=datetime.timezone.utc)
        today_tz = today_utc.astimezone(tz)  # 2011-12-29T23:59:00-10:00
        tomorrow = add_day(today_tz)
        return tomorrow.isoformat() == '2011-12-31T23:59:00+14:00'
    
    
    def test_dst(add_day):
        """Test if add_day properly increases the calendar day if DST happens."""
        tz = pytz.timezone('Europe/Berlin')
        today_utc = datetime.datetime(2018, 3, 25, 0, 59,
                                      tzinfo=datetime.timezone.utc)
        today_tz = today_utc.astimezone(tz)  # 2018-03-25T01:59:00+01:00
        tomorrow = add_day(today_tz)
        return tomorrow.isoformat() == '2018-03-26T01:59:00+02:00'
    
    
    to_test = [(add_day_dateutil_relativedelta, 'relativedelta'),
               (add_day_datetime_timedelta, 'timedelta'),
               (add_day_datetime_timedelta_conversion, 'timedelta+conversion'),
               (add_day, 'timedelta+conversion+dst')]
    print('{:<25}: {:>5} {:>5}'.format('Method', 'Samoa', 'DST'))
    for method, name in to_test:
        print('{:<25}: {:>5} {:>5}'
              .format(name,
                      test_samoa(method),
                      test_dst(method)))

    Risultati del Test

    Method                   : Samoa   DST
    relativedelta            :     0     0
    timedelta                :     0     0
    timedelta+conversion     :     1     0
    timedelta+conversion+dst :     1     1
    • Le altre risposte non sono del tutto sbagliato, sono perfettamente bene mentre si lavora con l’UTC o ingenuo (tzinfo == None) datetimes.

Lascia un commento