Подтвердить что ты не робот

Почему Python datetime.strftime('% w') и datetime.weekday() используют разные индексы для дней недели?

В Python, показывающий день недели как целое число с использованием datetime.strftime(), показывает другой результат, чем использование datetime.weekday().

>>> import datetime
>>> now = datetime.datetime.now()
>>> now.strftime('%A')
'Sunday'
>>> now.strftime('%w') # Day of the week as an integer.
'0'
>>> now.weekday() # Day of the week as an integer, a different way.
6

С strftime() формат строки %w имеет воскресенье в качестве первого дня недели. С weekday(), вместо этого в понедельник.

Какова история того, почему эти две разные?

4b9b3361

Ответ 1

Функция Python strftime эмулирует это в библиотеке c. Таким образом, мотивация, что %w возвращает 0 для воскресенья, полностью исходит из этого.

Напротив, метод date.weekday() возвращает a 6 для воскресенья, поскольку он стремится соответствовать поведению гораздо более старого модуля time. Внутри этого модуля времена обычно обозначаются символом struct_time и внутри этого, struct_time.tm_day использует 6 для представления воскресенья.

Тогда правильный вопрос... почему time.struct_time представляет воскресенье как 6, когда библиотека C tm struct использует 0??

И ответ... потому что он просто делает. Такое поведение существовало с тех пор, как Guido впервые проверил функции gmtime и localtime в 1993 году.

И Гвидо не может ошибаться... так что лучше спросите его.

Ответ 2

Первоначально стандарт ISO 8601 использовал 1 .. 7 для представления с понедельника по воскресенье. Для удобства позже разрешалась интерпретация 0=Sunday.

Если вы хотите использовать что-то более согласованное, попробуйте использовать isoweekday

Стандарт 0=Monday - это европейская конвенция. Думаю, это не удивительно: P

Ответ 3

Может быть, weekday основан на языковой версии, а strftime нет? Потому что у меня есть другой вывод:

In [14]: d.strftime("%A")
Out[14]: 'Sunday'

In [15]: d.strftime("%w")
Out[15]: '0'

In [16]: now.weekday()
Out[16]: 0