Почему 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()
, вместо этого в понедельник.
Какова история того, почему эти две разные?
Ответы
Ответ 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