El comando de fecha da el número de semana incorrecto para el 31 de diciembre

21

Cuando trato de obtener el número de semana para el 31 de diciembre, devuelve 1. Cuando obtengo el número de semana para el 30 de diciembre, obtengo 52 --- que es lo que esperaría. El día lunes es correcto. Esto está en un RPI que ejecuta Ubuntu.

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

52Sun

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

01Mon

Mismo problema sin cadena de tiempo

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

01Mon
George Shafer
fuente
99
"El comando de fecha da el número de semana incorrecto para el 31 de diciembre" - "¿Incorrecto" según qué especificación? ¿La especificación que está utilizando es la misma que datedice el manual ?
Jörg W Mittag
2
Quizás te interese ¿Por qué el control MonthCalendar muestra los números de semana equivocados en Rumania? La publicación del blog es sobre Windows, pero el problema que se está discutiendo es general (y parece ser el mismo que está encontrando).
un CVn
1
"¡La computadora debe estar equivocada, porque obviamente no cometí un error!" me recuerda cuando me quejé de que el compilador FORTRAN IV debe tener un error, porque mi primer programa simple no podía tener ningún error ...
RonJohn

Respuestas:

49

Esto te está dando la semana ISO que comienza un lunes.

El sistema de fechas semanales ISO es efectivamente un sistema de calendario de semana bisiesto que forma parte del estándar de fecha y hora ISO 8601 emitido por la Organización Internacional de Normalización (ISO) desde 1988 (última revisión en 2004) y, antes de eso, se definió en ISO (R) 2015 desde 1971. Se utiliza (principalmente) en el gobierno y las empresas para los años fiscales, así como en el cronometraje. Esto se conocía anteriormente como "codificación de fecha industrial". El sistema especifica un año semanal en la cima del calendario gregoriano definiendo una notación para las semanas ordinales del año.


Un año de numeración semanal ISO (también llamado año ISO informalmente) tiene 52 o 53 semanas completas. Eso es 364 o 371 días en lugar de los 365 o 366 días habituales. La semana adicional a veces se denomina semana bisiesta, aunque ISO 8601 no utiliza este término.

Las semanas comienzan con el lunes. El año de cada semana es el año gregoriano en el que cae el jueves. La primera semana del año, por lo tanto, siempre contiene el 4 de enero. La numeración ISO del año semanal, por lo tanto, se desvía ligeramente del gregoriano durante algunos días cerca del 1 de enero.


Si desea mostrar 31/12 como la semana 52, debe usar %U, que no usa el estándar ISO:

$ date -d "2018-12-31T1:58:55" +"%V%a"
01Mon
$ date -d "2018-12-31T1:58:55" +"%U%a"
52Mon
Jesse_b
fuente
Gracias. Eso es lo que estaba buscando. Utilicé un método mucho más complicado con el comando cal.
George Shafer
3

La definición del número de semana es diferente entre Europa y EE. UU., Probablemente según los estándares ISO frente a ANSI. Esto puede estar relacionado con una semana que es domingo - sábado o lunes - domingo, y esto nuevamente puede estar relacionado con la definición judía versus cristiana del Día del Señor (sábado vs domingo).

Para Europa, la semana número 1 contiene el primer jueves de enero y, por lo tanto, contiene un mínimo de 4 días (es decir, una mayoría) pertenecientes al nuevo año (jueves, viernes, sábado y domingo).

De todos modos, en los años en que TODOS (!!) los números de semana son +/- 1 diferentes entre Europa y los EE. UU., Esto es muy divertido al establecer horarios en empresas multinacionales. :-)

StessenJ
fuente