MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come convertire l'anno e la settimana dell'anno ottenuti dalla query MongoDB in Joda datetime?

ISO 8601

Joda-Time segue la ISO 8601 standard in definire le settimane .

  • Il lunedì è il primo giorno della settimana.
  • Le settimane sono numerate da 1 a 52 o 53.
  • I numeri delle settimane sono scritti con una W maiuscola , come W23 .
    Anno può essere anteposto, 2015-W23 .
  • Settimana n. 1, W01 , contiene il primo giovedì dell'anno.

Per quanto ne so, questa definizione standard è diventata sempre più comune nell'uso in vari paesi e settori.

Settimane domenicali

Il documento MongoDB definisce le settimane come:

Per quanto ne so, questa è una definizione prevalentemente americana, poco utilizzata al di fuori degli Stati Uniti.

Perché quella definizione dice da 0 a 53? Ciò significa "fino a 54 settimane". Non credo che questa definizione produrrebbe 54 settimane in un anno, ma non ci ho pensato bene.

Perché mescolare?

Non puoi davvero mescolare le due definizioni. Perché preoccuparsi? Se il tuo obiettivo è utilizzare la definizione di settimane di MongoDB e rappresentarle con una data e ora, scrivi il tuo convertitore.

Il mio consiglio sarebbe di abbandonare la definizione e la funzione di MongoDB e attenersi alla definizione standard.

Trova domenica

Se vuoi trovare la domenica che inizia una settimana nel mondo di MongoDB, scrivi la tua piccola funzione. Inserisci il numero dell'anno e della settimana e recupera un DateTime. In questo scenario, non hai bisogno delle funzionalità della settimana dell'anno di Joda-Time.

Qualcosa del genere.

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

Scarica su 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 eseguito.

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.