Пишем функцию для отображения текущего дня с помощью time_t ?

StackOverflow https://stackoverflow.com/questions/1445236

  •  22-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top