MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment convertir l'année et la semaine de l'année obtenues à partir de la requête MongoDB en datetime Joda ?

ISO 8601

Joda-Time suit la ISO 8601 standard dans définir les semaines .

  • Le lundi est le premier jour de la semaine.
  • Les semaines sont numérotées de 1 à 52 ou 53.
  • Les numéros de semaine sont écrits avec un W majuscule , comme W23 .
    L'année peut être précédée, 2015-W23 .
  • Semaine 1, W01 , contient le premier jeudi de l'année.

Autant que je sache, cette définition standard est de plus en plus utilisée dans divers pays et industries.

Semaines du dimanche

La documentation MongoDB définit les semaines comme :

Autant que je sache, il s'agit d'une définition principalement américaine, peu utilisée en dehors des États-Unis.

Pourquoi cette définition dit-elle de 0 à 53 ? Cela signifie "jusqu'à 54 semaines". Je ne pense pas que cette définition produirait 54 semaines par an, mais je n'y ai pas réfléchi.

Pourquoi mélanger ?

Vous ne pouvez pas vraiment mélanger les deux définitions. Pourquoi s'embêter? Si votre objectif est d'utiliser la définition des semaines de MongoDB et de les représenter par une date-heure, écrivez votre propre convertisseur.

Mon propre conseil serait d'abandonner la définition et la fonction de MongoDB et de s'en tenir à la définition standard.

Rechercher dimanche

Si vous voulez trouver le dimanche commençant une semaine dans le monde de MongoDB, écrivez votre propre petite fonction. Entrez le numéro de l'année et le numéro de la semaine, et récupérez un DateTime. Dans ce scénario, vous n'avez pas besoin des fonctionnalités hebdomadaires de Joda-Time.

Quelque chose comme ça.

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 );

Vider vers la console.

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

Lors de l'exécution.

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.