Pergunta

Eu tenho escrito um conversor de tempo para tomar os sistemas time_t e convertê-lo em data / hora legível. Oh, e este é o meu segundo script python nunca. Vamos deixar esse fato de lado e seguir em frente.

O script completo está hospedado aqui .

conversores escrevendo para o ano e mês foram bastante fácil, mas eu bati uma parede de tijolos sério tentando obter o dia de trabalho. Como você pode ver, eu tenho tentado usar força-bruta meu caminho todo o caminho desde 1970 até hoje. Infelizmente, o dia sai como -105.

Alguém sabe de uma maneira melhor de fazê-lo, ou uma maneira de corrigir o que tenho tentado aqui? É actualmente 03:30, por isso é bem possível que eu estou faltando algo óbvio.

Desculpe, eu esqueci de nota que eu estou fazendo isso manualmente, a fim de aprender python. Fazê-lo através de funções de data derrota a finalidade, infelizmente.

Foi útil?

Solução

(eu estou supondo que você esta para aprender Python, então eu vou apontar os erros em seu código).

>>> years = SecondsSinceEpoch / 31540000

Nonononono. Você não pode fazer isso. Alguns anos têm 31536000 segundos, outros têm 31622400 segundos.

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

Você não precisa testar se um valor verdadeiro é verdade. :-) Do:

>>> if calendar.isleap(yeariterator):

Em vez.

Também alterar:

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

Para:

para yeariterator na faixa (1970, yearsfordayfunction):

Isso também vai corrigir o seu erro:. Você não parar até depois de 2009, de modo a obter a resposta -105, porque há 105 dias restantes do ano

E, também, não há muito ponto no cálculo mês a mês. Ano após ano, funciona bem.

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

E um recuo de 8 espaços é muito. 4 é mais comum.

Além disso, eu calcular ano e dia do ano em um método, em vez de fazê-lo duas vezes.

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

Outras dicas

Por que não usar:

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

O módulo de data e hora lida com todos os casos de ponta - os anos bissextos, segundos bissextos, dias bissextos - bem como conversão de fuso horário (com segundo argumento opcional)

Você poderia fazê-lo também com time.strftime :

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

ou com datetime.date.strftime :

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

Eu também vou apontar algo estranho no código que você postou:

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

1.) Por que time.time() levantar um IOError? Tanto quanto eu sei que é impossível para que a função de levantar um erro, ele deve sempre retornar um valor.

2.) Print deve ser print.

3.) Mesmo se time.time fez levantar uma exceção IOError, você está engolir a exceção, que você provavelmente não quer fazer. A próxima linha requer SecondsSinceEpoch a ser definido, de modo que só vai levantar uma outra exceção (mais confuso).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top