Date à laquelle la commande donne un mauvais numéro de semaine pour le 31 décembre

21

Lorsque j'essaie d'obtenir le numéro de semaine du 31 décembre, il renvoie 1. Lorsque j'obtiens le numéro de semaine du 30 décembre, j'obtiens 52 --- ce à quoi je m'attendrais. Le jour lundi est correct. C'est sur un RPI exécutant Ubuntu.

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

52Sun

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

01Mon

Même problème sans chaîne de temps

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

01Mon
George Shafer
la source
9
"La commande de date donne un mauvais numéro de semaine pour le 31 décembre" - "Mauvais" selon quelle spécification? La spécification que vous utilisez est-elle la même que celle indiquée dans le manuel date?
Jörg W Mittag
2
Vous pourriez être intéressé Pourquoi le contrôle MonthCalendar affiche les numéros de semaine faux en Roumanie? Le billet de blog concerne Windows, mais le problème en cours de discussion est général (et semble être le même que ce que vous rencontrez).
un CVn
1
"L'ordinateur doit être faux, car je n'ai évidemment pas fait d'erreur!" me rappelle quand je me suis plaint que le compilateur FORTRAN IV devait avoir un bogue, parce que mon premier programme simple ne pouvait pas avoir d'erreurs ...
RonJohn

Réponses:

49

Cela vous donne la semaine ISO qui commence un lundi.

Le système de date hebdomadaire ISO est en fait un système de calendrier de semaine bissextile qui fait partie de la norme de date et d'heure ISO 8601 publiée par l'Organisation internationale de normalisation (ISO) depuis 1988 (dernière révision en 2004) et, avant cela, il était défini dans ISO (R) 2015 depuis 1971. Il est utilisé (principalement) dans les administrations publiques et les entreprises pendant les exercices, ainsi qu'en chronométrage. Ceci était auparavant connu sous le nom de «codage de date industriel». Le système spécifie une année de semaine au sommet du calendrier grégorien en définissant une notation pour les semaines ordinales de l'année.


Une année ISO de numérotation des semaines (également appelée informellement année ISO) comprend 52 ou 53 semaines complètes. C'est 364 ou 371 jours au lieu des 365 ou 366 jours habituels. La semaine supplémentaire est parfois appelée semaine bissextile, bien que l'ISO 8601 n'utilise pas ce terme.

Les semaines commencent le lundi. L'année de chaque semaine est l'année grégorienne au cours de laquelle le jeudi tombe. La première semaine de l'année contient donc toujours le 4 janvier. La numérotation ISO des semaines de l'année s'écarte donc légèrement du grégorien pendant quelques jours près du 1er janvier.


Si vous souhaitez afficher 12/31 comme semaine 52, vous devez utiliser %U, qui n'utilise pas la norme ISO:

$ date -d "2018-12-31T1:58:55" +"%V%a"
01Mon
$ date -d "2018-12-31T1:58:55" +"%U%a"
52Mon
Jesse_b
la source
Merci. Voilà ce que je cherchais. J'ai utilisé une méthode beaucoup plus compliquée avec la commande cal.
George Shafer
3

La définition du numéro de semaine est différente entre l'Europe et les États-Unis, probablement ISO par rapport aux normes ANSI. Cela peut être lié à une semaine du dimanche au samedi ou du lundi au dimanche, et cela peut à nouveau être lié à la définition juive contre chrétienne du jour du Seigneur (sabbat vs dimanche).

Pour l'Europe, la semaine numéro 1 contient le premier jeudi de janvier et contient donc un minimum de 4 jours (soit une majorité) appartenant à la nouvelle année (jeu-ven-sam-dim).

Quoi qu'il en soit, dans les années où TOUS (!!) les numéros de semaine sont +/- 1 différents entre l'Europe et les États-Unis, cela donne beaucoup de plaisir à définir les horaires dans les entreprises multinationales. :-)

StessenJ
la source