2012-06-26 19 views
34

Come posso stampare l'anno successivo se l'anno corrente è dato in python usando il codice più semplice, possibilmente in una riga usando il modulo datetime.Come stampare l'anno successivo in Python

+1

mi metterò '2005' dal seguente codice 'time.strftime (' % Y 'time.strptime (' 2005-11- 11 ','% Y-% m-% d '))' .. ora quello che mi serve è ottenere '2006' senza molte modifiche a questo codice – Alchemist777

+1

'time.strptime ('2005-11-11', '% Y-% m-% d '). Tm_year + 1' – icecrime

+4

'anno di stampa + 1' – Matthias

risposta

101

Entrambi gli oggetti data e datetime hanno un attributo year, che è un numero. Basta aggiungere 1:

>>> from datetime import date 
>>> print date.today().year + 1 
2013 

Se avete l'anno corrente in una variabile, basta aggiungere 1 direttamente, non c'è bisogno di perdere tempo con il modulo datetime:

>>> year = 2012 
>>> print year + 1 
2013 

Se avete la data in una stringa , basta selezionare le 4 cifre che rappresentano l'anno e passarlo al int:

>>> date = '2012-06-26' 
>>> print int(date[:4]) + 1 
2013 

anno aritmetica è estremamente semplice, lo rendono un intero e basta aggiungere 1. non ottiene molto più semplice di questo

Se, tuttavia, si sta lavorando con una data tutta, ed è necessario la stessa data, ma un anno dopo, utilizzare i componenti per creare un nuovo date oggetto con l'anno incrementato di uno:

>>> today = date.today() 
>>> print date(today.year + 1, today.month, today.day) 
2013-06-26 

oppure è possibile utilizzare la funzione .replace, che restituisce una copia con il campo si specifica cambiato:

>>> print today.replace(year=today.year + 1) 
2013-06-26 

Nota che questo può avere un po 'difficile quando today è 29 febbraio in un anno bisestile. L'assoluto, fail-safe modo corretto di lavorare questo è così:

def nextyear(dt): 
    try: 
     return dt.replace(year=dt.year+1) 
    except ValueError: 
     # February 29th in a leap year 
     # Add 365 days instead to arrive at March 1st 
     return dt + timedelta(days=365) 
+1

La funzione' .replace' non funziona in modo affidabile. 'd = date (2012, 2, 29)' 'd.replace (year = d.year + 1)' genera 'ValueError: day is out of range for month' e nemmeno la precedente opzione per la costruzione di un nuovo oggetto data gestire questo caso. – Duncan

+0

@Duncan: bello; la domanda è allora, che cos'è il 29 febbraio un anno dopo? 1 marzo? –

+2

Di solito il 1 ° marzo ma potrebbero esserci delle eccezioni. Se sottoscrivi un legame di 1 anno il 29 febbraio, penso che maturerà il 1 marzo dell'anno successivo. Ovviamente, una volta entrati nei calcoli monetari, maturerà effettivamente il primo giorno lavorativo che è almeno un anno di riposo durante i fine settimana e nei giorni festivi. – Duncan

Problemi correlati