Question

J'ai écrit un convertisseur de temps pour prendre le système time_t et le convertir en date / heure lisible par l'homme. Oh, et ceci est mon deuxième script Python. Laissons cela de côté et passons à autre chose.

Le script complet est hébergé à ici .

Écrire des convertisseurs pour l’année et le mois était assez facile, mais j’ai heurté un grave mur de briques pour tenter de faire fonctionner la journée. Comme vous pouvez le constater, j'ai essayé de forcer mon chemin de 1970 à aujourd'hui. Malheureusement, le jour arrive à -105.

Est-ce que quelqu'un connaît un meilleur moyen de le faire ou un moyen de réparer ce que j'ai tenté de faire ici? Il est actuellement 3 h 30, il est donc fort possible que je manque quelque chose d'évident.

Désolé, j'ai oublié de noter que je le fais manuellement pour apprendre le python. Le faire via les fonctions de date annule le but, malheureusement.

Était-ce utile?

La solution

(Je suppose que vous faites cela pour apprendre Python, je vais donc signaler les erreurs dans votre code).

>>> years = SecondsSinceEpoch / 31540000

Nonononono. Tu ne peux pas faire ça. Certaines années ont 31536000 secondes, d’autres 31622400 secondes.

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

Vous n'avez pas besoin de tester si une valeur vraie est vraie. :-) Faites:

>>> if calendar.isleap(yeariterator):

Au lieu de cela.

Changer également:

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

À:

  
    
      

pour le millésime dans la plage (1970, fonction années):

    
  

Cela corrigera également votre erreur: vous ne vous arrêtez pas après 2009, vous obtenez donc la réponse -105, car il reste 105 jours de l'année.

Et aussi, il n’ya pas grand intérêt à calculer mois par mois. D'année en année, ça fonctionne bien.

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

Et un retrait de 8 espaces, c’est beaucoup. 4 est plus commun.

De plus, je calculerais l'année et le jour de l'année selon une méthode, au lieu de le faire deux fois.

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

Autres conseils

Pourquoi ne pas utiliser:

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

Le module datetime gère tous les cas extrêmes - années bissextiles, secondes bissextiles, jours bissextiles - ainsi que la conversion de fuseau horaire (avec le second argument optionnel)

Vous pouvez le faire avec time.strftime :

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

ou avec datetime.date.strftime :

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

Je signalerai également quelque chose d'étrange dans le code que vous avez posté:

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

1.) Pourquoi time.time () déclenche-t-il une erreur IOError? Autant que je sache, il est impossible pour cette fonction de générer une erreur, elle devrait toujours renvoyer une valeur.

2.) Imprimer doit être impression .

3.) Même si time.time a généré une exception IOError , vous avalez l'exception, ce que vous ne voulez probablement pas faire. La ligne suivante nécessite la définition de SecondsSinceEpoch , afin que cela ne déclenche qu'une autre exception (plus source de confusion).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top