Polecenie daty podaje nieprawidłowy numer tygodnia na 31 grudnia

21

Kiedy próbuję uzyskać numer tygodnia dla 31 grudnia, zwraca 1. Gdy otrzymam numer tygodnia dla 30 grudnia, otrzymuję 52 --- tego właśnie oczekiwałbym. Dzień w poniedziałek jest poprawny. To jest na RPI z Ubuntu.

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

52Sun

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

01Mon

Ten sam problem bez ciągu czasu

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

01Mon
George Shafer
źródło
9
„Polecenie daty podaje nieprawidłowy numer tygodnia dla 31 grudnia” - „Błędny” zgodnie z jaką specyfikacją? Czy specyfikacja, której używasz, jest taka sama, jak podana w instrukcji date?
Jörg W Mittag
2
Możesz być zainteresowany Dlaczego kontrola MonthCalendar pokazuje nieprawidłowe numery tygodni w Rumunii? Wpis na blogu dotyczy systemu Windows, ale omawiany problem jest ogólny (i wydaje się, że jest taki sam, jak to, co napotykasz).
CVn
1
„Komputer musi być nieprawidłowy, ponieważ oczywiście nie popełniłem błędu!” przypomina mi, kiedy narzekałem, że kompilator FORTRAN IV musi mieć błąd, ponieważ mój pierwszy prosty program nie mógł zawierać żadnych błędów ...
RonJohn,

Odpowiedzi:

49

To daje tydzień ISO, który zaczyna się w poniedziałek.

System daty tygodnia ISO jest w rzeczywistości systemem kalendarza tygodnia przestępnego, który jest częścią normy daty i godziny ISO 8601 wydanej przez Międzynarodową Organizację Normalizacyjną (ISO) od 1988 r. (Ostatnio zmienionej w 2004 r.), A wcześniej została zdefiniowana w ISO (R) 2015 od 1971 r. Jest stosowany (głównie) w administracji i biznesie przez lata podatkowe, a także w mierzeniu czasu. Było to wcześniej znane jako „kodowanie daty przemysłowej”. System określa rok tygodnia na szczycie kalendarza gregoriańskiego, definiując notację dla zwykłych tygodni roku.


Rok numeracji ISO w roku (zwany również nieformalnie rokiem ISO) ma 52 lub 53 pełne tygodnie. To 364 lub 371 dni zamiast zwykłych 365 lub 366 dni. Dodatkowy tydzień jest czasem określany jako tydzień przestępny, chociaż ISO 8601 nie używa tego terminu.

Tygodnie zaczynają się od poniedziałku. Każdego tygodnia jest rok gregoriański, w którym przypada czwartek. Dlatego pierwszy tydzień roku zawsze zawiera 4 stycznia. W związku z tym numeracja roku tygodnia ISO nieco odbiega od gregoriańskiego w przypadku dni zbliżonych do 1 stycznia.


Jeśli chcesz pokazać 12/31 jako tydzień 52, powinieneś użyć %U, który nie korzysta ze standardu ISO:

$ date -d "2018-12-31T1:58:55" +"%V%a"
01Mon
$ date -d "2018-12-31T1:58:55" +"%U%a"
52Mon
Jesse_b
źródło
Dzięki. Właśnie tego szukałem. Użyłem znacznie bardziej skomplikowanej metody z poleceniem cal.
George Shafer,
3

Definicja numeru tygodnia jest różna w Europie i USA, prawdopodobnie ISO w porównaniu ze standardami ANSI. Może to być związane z tygodniem niedziela - sobota lub poniedziałek - niedziela, a to znowu może być związane z żydowską kontra chrześcijańską definicją Dnia Pańskiego (szabat vs niedziela).

W Europie tydzień nr 1 zawiera pierwszy czwartek w styczniu, a zatem zawiera minimum 4 dni (tj. Większość) należącą do nowego roku (czwartek-piątek-sobota-niedziela).

W każdym razie, w takich latach, w których WSZYSTKIE (!!) numery tygodni różnią się o +/- 1 w Europie i USA, daje to świetną zabawę przy ustalaniu harmonogramów w międzynarodowych firmach. :-)

StessenJ
źródło