ISO 8601
Joda-Time jest zgodny z ISO 8601 standard w definiowaniu tygodni .
- Poniedziałek to pierwszy dzień tygodnia.
- Tygodnie są ponumerowane od 1 do 52 lub 53.
- Numery tygodni są pisane wielkimi literami
W
, na przykładW23
.
Rok może być poprzedzony,2015-W23
. - Tydzień 1,
W01
, zawiera pierwszy czwartek roku.
O ile mi wiadomo, ta standardowa definicja jest coraz powszechniej stosowana w różnych krajach i branżach.
Niedzielne tygodnie
dokument MongoDB definiuje tygodnie jako:
O ile mi wiadomo, jest to w większości amerykańska definicja, rzadko używana poza Stanami Zjednoczonymi.
Dlaczego ta definicja mówi od 0 do 53? Oznacza to „do 54 tygodni”. Nie sądzę, aby ta definicja dawała 54 tygodnie w dowolnym roku, ale nie przemyślałam tego.
Dlaczego mieszać?
Nie można tak naprawdę mieszać tych dwóch definicji. Po co się męczyć? Jeśli Twoim celem jest użycie definicji tygodni MongoDB i przedstawienie ich według daty i godziny, napisz własny konwerter.
Moją własną radą byłoby porzucenie definicji i funkcji MongoDB i pozostanie przy standardowej definicji.
Znajdź niedzielę
Jeśli chcesz znaleźć niedzielę rozpoczynającą tydzień w świecie MongoDB, napisz swoją własną małą funkcję. Podaj numer roku i numer tygodnia i odzyskaj DateTime. W tym scenariuszu nie potrzebujesz funkcji tygodniowych Joda-Time.
Coś takiego.
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 );
Zrzuć do konsoli.
System.out.println ( "Sunday-based week of year:" + yearNumber + " week: " + weekNumber + " starts: " + sunday + "." );
System.out.println ( "Adjusted to time zone: " + zone + " is: " + dateTime + "." );
Po uruchomieniu.
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.