MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como converter o ano e a semana do ano obtidos da consulta do MongoDB em Joda datetime?

ISO 8601


Joda-Time segue a ISO 8601 padrão em definindo semanas .
  • Segunda-feira é o primeiro dia da semana.
  • As semanas são numeradas de 1 a 52 ou 53.
  • Os números da semana são escritos com um W maiúsculo , como W23 .
    O ano pode ser prefixado, 2015-W23 .
  • Semana nº 1, W01 , contém a primeira quinta-feira do ano.

Até onde eu sei, essa definição padrão vem se tornando mais comum em vários países e indústrias.

Semanas de Domingo


O documento MongoDB define semanas como:

Tanto quanto sei, esta é uma definição principalmente americana, não muito usada fora dos EUA.

Por que essa definição diz de 0 a 53? Isso significa "até 54 semanas". Eu não acho que essa definição produziria 54 semanas em qualquer ano, mas não pensei nisso.

Por que misturar?


Você não pode realmente misturar as duas definições. Porque se importar? Se seu objetivo é usar a definição de semanas do MongoDB e representá-las por uma data e hora, escreva seu próprio conversor.

Meu próprio conselho seria abandonar a definição e a função do MongoDB e ficar com a definição padrão.

Encontrar domingo


Se você quiser encontrar o domingo começando uma semana no mundo do MongoDB, escreva sua própria pequena função. Insira o número do ano e o número da semana e receba de volta um DateTime. Nesse cenário, você não precisa dos recursos da semana do ano do Joda-Time.

Algo assim.
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 );

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

Quando executado.
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.