Написание функции для отображения текущего дня с использованием time_t? - PullRequest
1 голос
/ 18 сентября 2009

Я писал преобразователь времени, чтобы взять системное time_t и преобразовать его в удобочитаемую дату / время. О, и это мой второй скрипт на Python. Мы оставим этот факт в стороне и продолжим.

Полный скрипт размещен здесь .

Написание конвертеров для года и месяца было довольно простым, но я наткнулся на серьезную кирпичную стену, пытаясь заставить рабочий день работать. Как вы можете видеть, я пытался перебрать весь путь с 1970 года по сегодняшний день. К сожалению, день получается как -105.

Кто-нибудь знает лучший способ сделать это или способ исправить то, что я пытался здесь? Сейчас 3:30 утра, поэтому вполне возможно, что я упускаю что-то очевидное.

Извините, я забыл заметить, что я делаю это вручную для изучения Python. К сожалению, выполнение этого с помощью функций даты отрицательно сказывается на цели.

Ответы [ 4 ]

8 голосов
/ 18 сентября 2009

Почему бы не использовать:

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

Модуль datetime обрабатывает все крайние случаи - високосные годы, високосные секунды, високосные дни - а также преобразование часовых поясов (с необязательным вторым аргументом)

3 голосов
/ 18 сентября 2009

Вы можете сделать это либо с 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'
1 голос
/ 18 сентября 2009

(я предполагаю, что вы делаете это для изучения Python, поэтому я укажу на ошибки в вашем коде).

>>> years = SecondsSinceEpoch / 31540000

Nonononono. Вы не можете сделать это. Некоторые годы имеют 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
0 голосов
/ 19 сентября 2009

Я также укажу кое-что странное в коде, который вы разместили:

    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, так что это вызовет еще одно (более запутанное) исключение.

...