sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo convertir el año y la semana del año obtenidos de la consulta MongoDB en la fecha y hora de Joda?

ISO 8601

Joda-Time sigue la ISO 8601 estándar en definición de semanas .

  • El lunes es el primer día de la semana.
  • Las semanas están numeradas del 1 al 52 o 53.
  • Los números de las semanas se escriben con mayúscula W , como W23 .
    Se puede anteponer el año, 2015-W23 .
  • Semana # 1, W01 , contiene el primer jueves del año.

Hasta donde yo sé, esta definición estándar se ha vuelto más común en varios países e industrias.

Domingo Semanal

El documento de MongoDB define semanas como:

Hasta donde yo sé, esta es una definición principalmente estadounidense, que no se usa mucho fuera de los EE. UU.

¿Por qué esa definición dice 0 a 53? Eso significa "hasta 54 semanas". No creo que esta definición produzca 54 semanas en ningún año, pero no lo he pensado bien.

¿Por qué mezclar?

Realmente no se pueden mezclar las dos definiciones. ¿Por qué molestarse? Si su objetivo es utilizar la definición de semanas de MongoDB y representarlas mediante una fecha y hora, escriba su propio convertidor.

Mi propio consejo sería deshacerse de la definición y la función de MongoDB y ceñirse a la definición estándar.

Buscar el domingo

Si desea encontrar el domingo que comienza una semana en el mundo de MongoDB, escriba su propia pequeña función. Ingrese el número de año y el número de semana, y obtenga un DateTime. En este escenario, no necesita las funciones de semana del año de Joda-Time.

Algo como esto.

int yearNumber = 2015;
int weekNumber = 0;

LocalDate firstWeekSunday = null;
LocalDate firstOfYear = new LocalDate ( yearNumber, 1, 1 );
if ( firstOfYear.getDayOfWeek ( ) == DateTimeConstants.SUNDAY ) {
    firstWeekSunday = firstOfYear;
} else { // ELSE not Sunday.
    firstWeekSunday = firstOfYear.minusDays ( firstOfYear.getDayOfWeek ( ) );  // Joda-Time uses standard ISO 8601 weeks, where Monday = 1, Sunday = 7.
}
LocalDate sunday = firstWeekSunday.plusWeeks ( weekNumber );

DateTimeZone zone = DateTimeZone.forID ( "America/Montreal" );
DateTime dateTime = sunday.toDateTimeAtStartOfDay ( zone );

Volcar a la consola.

System.out.println ( "Sunday-based week of year:" + yearNumber + " week: " + weekNumber + " starts: " + sunday + "." );
System.out.println ( "Adjusted to time zone: " + zone + " is: " + dateTime + "." );

Cuando se ejecuta.

Sunday-based week of year:2015 week: 0 starts: 2014-12-28.
Adjusted to time zone: America/Montreal is: 2014-12-28T00:00:00.000-05:00.