Pregunta

He estado escribiendo un convertidor de tiempo para tomar los sistemas time_t y convertirlo en fecha / hora legible por humanos. Ah, y este es mi segundo script de Python. Dejaremos ese hecho a un lado y seguiremos adelante.

El script completo está alojado aquí .

Escribir convertidores para el año y el mes fue bastante fácil, pero me encontré con un muro de ladrillos serio tratando de hacer que el día funcionara. Como puede ver, he estado tratando de forzarme la fuerza bruta desde 1970 hasta hoy. Desafortunadamente, el día sale como -105.

¿Alguien sabe de una mejor manera de hacerlo, o una forma de arreglar lo que he intentado aquí? Actualmente son las 3:30 a.m., por lo que es muy posible que me falte algo obvio.

Lo siento, olvidé notar que estoy haciendo esto manualmente para aprender Python. Hacerlo a través de funciones de fecha frustra el propósito, desafortunadamente.

¿Fue útil?

Solución

(Asumo que haces esto para aprender Python, así que señalaré los errores en tu código).

>>> years = SecondsSinceEpoch / 31540000

Nonononono. No puedes hacer eso. Algunos años tienen 31536000 segundos, otros tienen 31622400 segundos.

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

No necesita probar si un valor verdadero es verdadero. :-) Hacer:

>>> if calendar.isleap(yeariterator):

En su lugar.

También cambia:

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

Para:

  
    
      

para yeariterator en rango (1970, años para la función diaria):

    
  

Eso también solucionará su error: no se detiene hasta DESPUÉS de 2009, por lo que obtiene la respuesta -105, porque quedan 105 días del año.

Y además, no tiene mucho sentido calcular mes a mes. Año tras año funciona bien.

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

Y una sangría de 8 espacios es mucho. 4 es más común.

Además, calcularía el año y el día del año en un método, en lugar de hacerlo dos veces.

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

Otros consejos

¿Por qué no usar?

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

El módulo de fecha y hora maneja todos los casos límite (años bisiestos, segundos bisiestos, días bisiestos), así como la conversión de zona horaria (con un segundo argumento opcional)

Puede hacerlo 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'

También señalaré algo extraño en el código que publicó:

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

1.) ¿Por qué time.time () generaría un IOError? Por lo que sé, es imposible que esa función genere un error, siempre debería devolver un valor.

2.) Imprimir debe ser print .

3.) Incluso si time.time generó una excepción IOError , está tragándose la excepción, lo que probablemente no quiera hacer. La siguiente línea requiere que se defina SecondsSinceEpoch , por lo que eso solo generará otra excepción (más confusa).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top