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.

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top