Escrever uma função para exibir dia atual usando time_t?
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.
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).