Scrivi una funzione per visualizzare il giorno corrente usando time_t?
Domanda
Ho scritto un convertitore di tempo per prendere i sistemi time_t e convertirlo in data / ora leggibili dall'uomo. Oh, e questo è il mio secondo script Python di sempre. Lasceremo da parte questo fatto e andremo avanti.
Lo script completo è ospitato qui .
Scrivere convertitori per l'anno e il mese è stato abbastanza facile, ma ho colpito un serio muro di mattoni cercando di far funzionare la giornata. Come puoi vedere, dal 1970 ad oggi ho cercato di forzare la mia forza. Sfortunatamente, il giorno esce come -105.
Qualcuno conosce un modo migliore per farlo, o un modo per risolvere ciò che ho tentato qui? Sono attualmente le 3:30 del mattino, quindi è possibile che mi manchi qualcosa di ovvio.
Scusa, ho dimenticato di notare che lo sto facendo manualmente per imparare Python. Farlo tramite le funzioni di data purtroppo vanifica lo scopo.
Soluzione
(Suppongo che lo facciate per imparare Python, quindi indicherò gli errori nel vostro codice).
>>> years = SecondsSinceEpoch / 31540000
Nonononono. Non puoi farlo. Alcuni anni hanno 31536000 secondi, altri 31622400 secondi.
>>> if calendar.isleap(yeariterator) == True:
Non è necessario verificare se un valore vero è vero. :-) Sì:
>>> if calendar.isleap(yeariterator):
Al posto.
Cambia anche:
>>> yeariterator = 1969
>>> iterator = 0
>>> while yeariterator < yearsfordayfunction:
>>> yeariterator = yeariterator + 1
A:
per yeariterator in range (1970, yearsfordayfunction):
Ciò risolverà anche il tuo errore: non ti fermi fino a DOPO il 2009, quindi ottieni la risposta -105, perché mancano 105 giorni all'anno.
E inoltre, non ha molto senso calcolare un mese per mese. Anno per anno funziona bene.
for yeariterator in range(1970, yearsfordayfunction):
if calendar.isleap(yeariterator) == True:
days = days - 366
else:
days = days - 365
E un rientro di 8 spazi è molto. 4 è più comune.
Inoltre, calcolerei anno e giorno dell'anno con un metodo, invece di farlo due volte.
def YearDay():
SecondsSinceEpoch = int(time.time())
days = SecondsSinceEpoch // 86400 # Double slash means floored int.
year = 1970
while True:
if calendar.isleap(year):
days -= 366
else:
days -= 365
year += 1
if calendar.isleap(year):
if days <= 366:
return year, days
else:
if days <= 365:
return year, days
def MonthDay(year, day):
if calendar.isleap(year):
monthstarts = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]
else:
monthstarts = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]
month = 0
for start in monthstarts:
if start > day:
return month, day - monthstarts[month-1] + 1
month += 1
Altri suggerimenti
Perché non usare:
from datetime import datetime
the_date = datetime.fromtimestamp(the_time)
print(the_date.strftime('%Y %B %d'))
Il modulo datetime gestisce tutti i casi limite - anni bisestili, secondi bisestili, giorni bisestili - nonché la conversione del fuso orario (con secondo argomento opzionale)
Puoi farlo con time.strftime
:
>>> import time
>>> time.strftime('%Y %B %d')
'2009 September 18'
o con datetime.date.strftime
:
>>> import datetime
>>> datetime.date.today().strftime('%Y %B %d')
'2009 September 18'
Indico anche qualcosa di strano nel codice che hai pubblicato:
try:
SecondsSinceEpoch = time.time()
except IOError:
Print("Unable to get your system time!")
1.) Perché time.time ()
genera un IOError? Per quanto ne so, è impossibile che quella funzione generi un errore, dovrebbe sempre restituire un valore.
2.) Stampa
dovrebbe essere print
.
3.) Anche se time.time
ha sollevato un'eccezione IOError
, stai ingoiando l'eccezione, che probabilmente non vorrai fare. La riga successiva richiede la definizione di SecondsSinceEpoch
, in modo che si sollevi un'altra eccezione (più confusa).