Написание функции для отображения текущего дня с использованием time_t?
Я писал конвертер времени, чтобы взять системное time_t и преобразовать его в удобочитаемую дату / время. О, и это мой второй скрипт на Python. Мы оставим этот факт в стороне и продолжим.
Полный сценарий размещен здесь.
Написание конвертеров для года и месяца было довольно простым, но я наткнулся на серьезную кирпичную стену, пытаясь заставить рабочий день работать. Как вы можете видеть, я пытался перебрать весь путь с 1970 года по сегодняшний день. К сожалению, день выходит как -105.
Кто-нибудь знает лучший способ сделать это, или способ исправить то, что я пытался здесь? Сейчас 3:30 утра, поэтому вполне возможно, что я упускаю что-то очевидное.
Извините, я забыл отметить, что я делаю это вручную, чтобы выучить Python. К сожалению, выполнение этого с помощью функций даты отрицательно сказывается на цели.
4 ответа
(Я предполагаю, что вы делаете это для изучения Python, поэтому я укажу на ошибки в вашем коде).
>>> years = SecondsSinceEpoch / 31540000
Нет-нет-нет-нет-нет. Вы не можете сделать это. Некоторые годы имеют 31536000 секунд, другие - 31622400 секунд.
>>> if calendar.isleap(yeariterator) == True:
Вам не нужно проверять, является ли истинное значение истинным.:-) Делать:
>>> if calendar.isleap(yeariterator):
Вместо.
Также измените:
>>> yeariterator = 1969
>>> iterator = 0
>>> while yeariterator < yearsfordayfunction:
>>> yeariterator = yeariterator + 1
Для того, чтобы:
для годового итератора в диапазоне (1970, лет для дневной функции):
Это также исправит вашу ошибку: вы не остановитесь до ПОСЛЕ 2009 г., поэтому вы получите ответ -105, потому что в году осталось 105 дней.
А также, нет особого смысла в расчете месяц за месяцем. Год за годом работает отлично.
for yeariterator in range(1970, yearsfordayfunction):
if calendar.isleap(yeariterator) == True:
days = days - 366
else:
days = days - 365
И отступ в 8 пробелов - это много. 4 чаще встречается.
Кроме того, я бы вычислял год и день года одним способом, а не дважды.
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
Почему бы не использовать:
from datetime import datetime
the_date = datetime.fromtimestamp(the_time)
print(the_date.strftime('%Y %B %d'))
Модуль datetime обрабатывает все крайние случаи - високосные годы, високосные секунды, високосные дни - а также преобразование часового пояса (с необязательным вторым аргументом)
Вы можете сделать это либо с time.strftime
:
>>> import time
>>> time.strftime('%Y %B %d')
'2009 September 18'
или с datetime.date.strftime
:
>>> import datetime
>>> datetime.date.today().strftime('%Y %B %d')
'2009 September 18'
Я также укажу кое-что странное в коде, который вы разместили:
try:
SecondsSinceEpoch = time.time()
except IOError:
Print("Unable to get your system time!")
1.) Зачем time.time()
поднять IOError? Насколько я знаю, для этой функции невозможно выдать ошибку, она всегда должна возвращать значение.
2.) Print
должно быть print
,
3.) Даже если time.time
действительно поднял IOError
исключение, вы проглатываете исключение, которое вы, вероятно, не хотите делать. Следующая строка требует SecondsSinceEpoch
быть определенным, так что это просто вызовет другое (более запутанное) исключение.