Написание функции для отображения текущего дня с использованием 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 быть определенным, так что это просто вызовет другое (более запутанное) исключение.

Другие вопросы по тегам