Команда дати дає неправильний номер тижня для 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користувача?
Йорг W Міттаг


2
Вас може зацікавити Чому контроль MonthCalendar показує неправильні номери тижнів у Румунії? Повідомлення в блозі стосується Windows, але питання, про яке йде мова, є загальним (і, схоже, те, що ви стикаєтесь).
CVn

1
"Комп'ютер повинен помилятися, тому що я, очевидно, не помилився!" нагадує мені, коли я скаржився, що у компілятора FORTRAN IV має бути помилка, тому що в моїй першій простої програмі не могло бути помилок ...
RonJohn

Відповіді:


49

Це дає вам тиждень ISO, який починається в понеділок.

Система дат ISO тижнів - це фактично календарна система високосного тижня, яка є частиною стандарту дати та часу ISO 8601, виданого Міжнародною організацією зі стандартизації (ISO) з 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

Спасибі. Це те, що я шукав. Я використовував набагато більш звичний метод із командою cal.
Джордж Шафер

3

Визначення числа тижнів відрізняється між Європою та США, ймовірно, ISO та стандартами ANSI. Це може бути пов'язано з тижнім, що є неділею - суботою або понеділком - неділею, і це знову може бути пов'язане з визначенням єврейського та християнського визначення Господнього дня (субота проти неділі).

Для Європи тиждень №1 містить перший четвер січня, і, таким чином, він містить мінімум 4 дні (тобто більшість), що належать до нового року (Чт-Пт-Сб-Нд).

У будь-якому разі, у такі роки, коли ВСІ (!!) тижні на +/- 1 різняться між Європою та США, це дає велике задоволення від встановлення графіків роботи в міжнародних компаніях. :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.