Команда Date дает неверный номер недели для 31 декабря

21

Когда я пытаюсь получить номер недели для 31 декабря, он возвращает 1. Когда я получаю номер недели для 30 декабря, я получаю 52 --- что я и ожидал. День понедельник правильный. Это на RPI под управлением Ubuntu.

$ date -d "2018-12-30T1:58:55" +"%V%a"

52Sun

$ date -d "2018-12-31T1:58:55" +"%V%a"

01Mon

Та же проблема без строки времени

$ date -d "2018-12-31" +"%V%a"

01Mon
Джордж Шафер
источник
9
«Команда даты дает неправильный номер недели для 31 декабря» - «Неправильно» в соответствии с какой спецификацией? Является ли используемая вами спецификация той же, что и в руководстве, в которой dateона указана?
Йорг Миттаг
2
Возможно, вас заинтересует, почему элемент управления MonthCalendar отображает неправильные номера недель в Румынии? В блоге рассказывается о Windows, но обсуждаемая проблема носит общий характер (и, похоже, совпадает с тем, с чем вы столкнулись).
CVN
1
«Компьютер должен быть не прав, потому что я, очевидно, не ошибся!» напоминает мне о том, когда я жаловался, что в компиляторе FORTRAN IV должна быть ошибка, потому что в моей первой простой программе не могло быть ошибок ...
RonJohn

Ответы:

49

Это дает вам неделю ISO, которая начинается в понедельник.

Система дат недели ИСО по сути является календарной системой високосной недели, которая является частью стандарта даты и времени ISO 8601, выпускаемого Международной организацией по стандартизации (ИСО) с 1988 года (последний раз пересматривался в 2004 году), и до этого она была определена в ISO (R) 2015 с 1971 года. Используется (главным образом) в правительстве и бизнесе на финансовые годы, а также в хронометраже. Ранее это называлось «Промышленное кодирование даты». Система указывает год недели поверх григорианского календаря, определяя обозначения для порядковых недель года.


Год нумерации недели ISO (также неофициально называется годом ISO) имеет 52 или 53 полных недели. Это 364 или 371 день вместо обычных 365 или 366 дней. Дополнительную неделю иногда называют високосной, хотя в стандарте ISO 8601 этот термин не используется.

Недели начинаются с понедельника. Год каждой недели - это григорианский год, в который выпадает четверг. Следовательно, первая неделя года всегда содержит 4 января. Таким образом, нумерация дней недели по ISO несколько отклоняется от григорианской в ​​течение нескольких дней, близких к 1 января.


Если вы хотите показать 12/31 как 52-ю неделю, вы должны использовать %U, который не использует стандарт ISO:

$ date -d "2018-12-31T1:58:55" +"%V%a"
01Mon
$ date -d "2018-12-31T1:58:55" +"%U%a"
52Mon
Jesse_b
источник
Спасибо. Это то, что я искал. Я использовал гораздо более запутанный метод с командой cal.
Джордж Шафер
3

Определение номера недели в Европе и США разное, вероятно, стандарты ISO и ANSI. Это может быть связано с тем, что неделя - воскресенье - суббота или понедельник - воскресенье, и это опять же может быть связано с еврейским и христианским определением Дня Господня (суббота против воскресенья).

Для Европы неделя № 1 содержит первый четверг января и, таким образом, содержит минимум 4 дня (т.е. большинство), относящихся к новому году (чт-пт-сб-вс).

В любом случае, в такие годы, когда ВСЕ (!!) номера недели в Европе и США различаются на +/- 1, это доставляет большое удовольствие при настройке расписаний в многонациональных компаниях. :-)

StessenJ
источник