tl; dr
myZonedDateTime.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)
... i ...
myZonedDateTime.get(IsoFields.WEEK_BASED_YEAR)
Unikaj klas date-time legacy
Jako correct Answer by haraldK wyjaśnia Calendar
Definicja klasy tygodnia różni się w zależności od ustawień narodowych. Chociaż ma dobre intencje, jest to mylące.
Powinieneś unikać Calendar
i powiązanych klas, takich jak Date
. Są teraz wypierane przez klasy java.time.
ISO 8601 tydzień
chodzi o ISO 8601 week, być jasne, że oznacza:
- Pierwszy dzień to poniedziałek, przebiegającej przez niedzielę.
- Tydzień numer jeden w tygodniu zawiera pierwszy czwartek roku kalendarzowego.
- Tygodniowy rok ma 52 lub 53 tygodnie.
- Pierwsze/ostatnie kilka dni w roku kalendarzowym może pojawić się w roku poprzedzającym/przyszłym.
java.time
W java.time klas obejmują między innymi wsparcie dla ISO 8601 standard weeks. Wywołaj metodę get
na różnych klasach, takich jak LocalDate
i ZonedDateTime
. Przekaż implementacje TemporalField
znalezione jako stałe w klasie IsoFields
.
int week = myZonedDateTime.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) ;
int weekBasedYear = myZonedDateTime.get(IsoFields.WEEK_BASED_YEAR) ;
ThreeTen-Extra
Jeszcze lepiej, dodać bibliotekę ThreeTen-Extra do projektu użyć YearWeek
klasę.
org.threeten.extra.YearWeek yw = YearWeek.from(myZonedDateTime) ;
Strzeż ustawień oprogramowania kalendarzowych
Nigdy nie zakładaj definicję numerem tygodnia. Upewnij się, że źródło takiej liczby ma taką samą definicję tygodnia jak Ty, takie jak definicja ISO 8601.
Na przykład: Calendar app supplied by Apple z macOS domyślnie przyjmuje definicję kalendarza "gregoriańskiego" z tygodnia. Co do tego, co to oznacza, nie wiem, ponieważ nie mogłem znaleźć żadnej dokumentacji na temat ich intencji/definicji. Dla ISO 8601 tygodni, musisz change a setting away from default.
O java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Te klasy zastępują kłopotliwe stare klasy dat-czasu, takie jak java.util.Date
, Calendar
, & SimpleDateFormat
.
Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz
. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.
Używanie JDBC driver zgodny z JDBC 4.2 lub później, można wymieniać java.time obiekty bezpośrednio z bazy danych. Nie ma potrzeby ciągi ani klas java.sql. *.
Gdzie można uzyskać lekcje java.time?
- Java SE 8, Java SE 9, a później
- wbudowanej.
- Część standardowego interfejsu API języka Java z pakietem implementacji.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i Java SE 7
- Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
- Android
- Późniejsze wersje Androida wdrożeń wiązce klas java.time.
- Dla wcześniejszego systemu Android projekt ThreeTenABP dostosowuje ThreeTen-Backport (wymieniony powyżej). Zobacz How to use ThreeTenABP….
Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval
, YearWeek
, YearQuarter
i more.
Jest specyficzny dla ustawień regionalnych. Ustawienie na przykład domyślnego 'Locale' na' Locale.UK', daje prawidłowy tydzień, 2. – haraldK
Ale to zmieniłoby inne rzeczy oprócz numeru tygodnia! –
Tak, zobacz poniżej moją odpowiedź na lepsze podejście. :-) – haraldK