Пишем функцию для отображения текущего дня с помощью time_t ?
Вопрос
Я писал конвертер времени, чтобы взять системное значение time_t и преобразовать его в удобочитаемую дату / время.О, и это мой второй скрипт на Python в истории.Мы оставим этот факт в стороне и двинемся дальше.
Полный сценарий размещен на сайте здесь.
Написать конвертеры за год и месяц было довольно легко, но я натолкнулся на серьезную кирпичную стену, пытаясь заставить день работать.Как вы можете видеть, я пытался добиться своего методом "грубой силы" с 1970 года по сегодняшний день.К сожалению, день заканчивается как -105.
Кто-нибудь знает лучший способ сделать это или способ исправить то, что я попытался здесь сделать?Сейчас 3:30 ночи, так что вполне возможно, я упускаю что-то очевидное.
Извините, я забыл отметить, что я делаю это вручную, чтобы изучить python.Выполнение этого с помощью функций даты, к сожалению, противоречит цели.
Решение
(Я предполагаю, что вы делаете это, чтобы изучить Python, поэтому я укажу на ошибки в вашем коде).
>>> years = SecondsSinceEpoch / 31540000
Нононононо.Ты не можешь этого сделать.Некоторые годы имеют 31536000 секунд, другие - 31622400 секунд.
>>> if calendar.isleap(yeariterator) == True:
Вам не нужно проверять, является ли значение true истинным.:-) Делай:
>>> if calendar.isleap(yeariterator):
Вместо этого.
Также изменяются:
>>> yeariterator = 1969
>>> iterator = 0
>>> while yeariterator < yearsfordayfunction:
>>> yeariterator = yeariterator + 1
Для:
для yeariterator в диапазоне (1970, yearsfordayфункция):
Это также исправит вашу ошибку:Вы не останавливаетесь до КОНЦА 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
.
3.) Даже если time.time
вызвало исключение IOError
, вы проглатываете исключение, которое вы, вероятно, не хотите делать. В следующей строке необходимо определить SecondsSinceEpoch
, чтобы это вызвало еще одно (более запутанное) исключение.