Frage

Ich habe einen Zeit-Wandler geschrieben, die Systeme zu nehmen Time_t und in für Menschen lesbares Datum / Uhrzeit zu konvertieren. Ach ja, und das ist mein zweiter Python-Skript überhaupt. Wir werden diese Tatsache beiseite lassen und weitermachen.

Das vollständige Skript wird gehostet hier .

Schreib Konverter für das Jahr und Monat war ziemlich einfach, aber ich habe eine schwere Mauer schlagen versuchen, Arbeit in den Tag zu bekommen. Wie Sie sehen können, habe ich versucht, meine Art und Weise den ganzen Weg von 1970 bis heute Brute-Force. Leider kommt der Tag, als -105 aus.

Kennt jemand einen besseren Weg, um es, oder eine Art und Weise zu tun, um zu reparieren, was ich hier versucht habe? Es ist zur Zeit 03.30, so ist es durchaus möglich, dass ich etwas offensichtlich fehlt bin.

Sorry, ich vergaß zu bemerken, dass ich diese von Hand, um mach Python zu lernen. Tut es über Datumsfunktionen Niederlagen den Zweck, leider.

War es hilfreich?

Lösung

(Ich gehe davon aus Sie tun dies Python zu lernen, so dass ich die Fehler in Ihrem Code hinweist).

>>> years = SecondsSinceEpoch / 31540000

Nonononono. Sie können das nicht tun. Einige Jahre haben 31536000 Sekunden, andere haben 31622400 Sekunden.

>>> if calendar.isleap(yeariterator) == True:

Sie brauchen nicht zu prüfen, ob ein wahrer Wert wahr ist. :-) Sie:

>>> if calendar.isleap(yeariterator):

Statt.

Auch ändern:

>>> yeariterator = 1969
>>> iterator = 0
>>> while yeariterator < yearsfordayfunction:
>>>     yeariterator = yeariterator + 1

An:

  
    
      

für yeariterator in Bereich (1970, yearsfordayfunction):

    
  

Das wird auch Ihre Fehler beheben: Sie müssen nicht bis nach 2009 stoppen, so dass Sie die Antwort -105 erhalten, weil es 105 Tage des Jahres verlassen

.

Und auch, gibt es nicht viel Sinn, von Monat zu Monat zu berechnen. Jahr für Jahr funktioniert.

    for yeariterator in range(1970, yearsfordayfunction):
            if calendar.isleap(yeariterator) == True:
                    days = days - 366
            else:
                    days = days - 365

Und ein Gedankenstrich 8 Räume ist eine ganze Menge. 4 ist häufiger.

Auch ich würde berechnen Jahr und Tag des Jahres in einem Verfahren, statt es zweimal tun.

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

Andere Tipps

Warum nicht verwenden:

from datetime import datetime
the_date = datetime.fromtimestamp(the_time)
print(the_date.strftime('%Y %B %d'))

Der Datetime-Modul verwaltet alle Grenzfälle - Schaltjahre, Schaltsekunden, Tage springen - sowie Zeitzone-Konvertierung (mit optionalem zweiten Argumente)

Sie könnten es tun, entweder mit time.strftime :

>>> import time
>>> time.strftime('%Y %B %d')
'2009 September 18'

oder mit datetime.date.strftime :

>>> import datetime
>>> datetime.date.today().strftime('%Y %B %d')
'2009 September 18'

Ich werde auch etwas Merkwürdiges im Code weisen darauf hin, Sie auf dem Laufenden:

    try:
            SecondsSinceEpoch = time.time()
    except IOError:
            Print("Unable to get your system time!")

1.) Warum sollte time.time() eine IOError erhöhen? Soweit ich weiß, dass es unmöglich ist, für diese Funktion einen Fehler zu erhöhen, sollte es immer einen Wert zurück.

2.) Print sollte print werden.

3.) Auch wenn time.time eine IOError Ausnahme tat erhöhen, Sie schlucken die Ausnahme, die Sie wahrscheinlich nicht wollen, zu tun. Die nächste Zeile erfordert SecondsSinceEpoch definiert werden, so dass wird nur eine weitere (verwirrende) Ausnahme ausgelöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top