GregorianCalendar muhtemelen kullanımdan kaldırılacağı veya gelecekteki JDK sürümlerinden kaldırılacağı için bazı kodların bulunduğu bir Java 8 güncellemesi.
Yeni kod, WeekFields
sınıfta ve özellikle alan erişimcisi ile küçük harf y
/ büyük harf için işlenir .Y
weekBasedYear()
Bu WeekFields temel alınarak, hafta bazlı yılın yılına erişmek için bir alan döndürür. Bu, Pazartesi gibi haftanın sabit bir gününde başladığı yıl kavramını temsil eder ve her hafta tam olarak bir yıla aittir. Bu alan genellikle dayOfWeek () ve weekOfWeekBasedYear () ile kullanılır.
Birinci hafta (1), yılda en az getMinimalDaysInFirstWeek () gününün olduğu getFirstDayOfWeek () ile başlayan haftadır. Bu nedenle, birinci hafta yılın başlangıcından önce başlayabilir. İlk hafta yılın başlangıcından sonra başlıyorsa, önceki dönem bir önceki yılın son haftasıdır.
Bu alan herhangi bir takvim sistemiyle kullanılabilir.
Ayrıştırmanın çözümleme aşamasında, hafta bazlı yıl, hafta-yıl ve haftanın gününden bir tarih oluşturulabilir.
Katı modda, üç alan da geçerli değer aralıklarına göre doğrulanır. Yılın haftası alanı, sonuçta elde edilen hafta temelli yılın, istenen hafta temelli yıl olmasını sağlamak için doğrulanır.
Akıllı modda, her üç alan da geçerli değer aralığına göre doğrulanır. Haftanın-haftası-temelli-yıl alanı 1'den 53'e kadar doğrulanır, bu da sonuç tarihinin sonraki hafta-temelli yıl içinde belirtilen tarih olabileceği anlamına gelir.
Esnek modda, yıl ve haftanın günü, geçerli değerler aralığına göre doğrulanır. Ortaya çıkan tarih, aşağıdaki üç aşamalı yaklaşıma eşdeğer olarak hesaplanır. İlk olarak, istenen hafta bazlı yılda ilk haftanın ilk gününde bir tarih oluşturun. Ardından, haftanın haftasını temel alan yılı alın, birini çıkarın ve miktarı hafta olarak tarihe ekleyin. Son olarak, yerelleştirilmiş hafta içinde haftanın doğru gününe ayarlayın.
Bu WeekFields
örneğin kurulumu yerel ayara bağlıdır ve buna bağlı olarak farklı ayarlara sahip olabilir, Fransa gibi ABD ve Avrupa ülkeleri hafta başında farklı bir güne sahip olabilir.
Örneğin DateFormatterBuilder
Java 8, ayrıştırıcıyı yerel ayarla somutlaştırın ve Y
sembol için bu yerel ayarı kullanın :
public final class DateTimeFormatterBuilder {
...
private void parsePattern(String pattern) {
...
} else if (cur == 'Y') {
appendInternal(new WeekBasedFieldPrinterParser(cur, count));
} else {
...
static final class WeekBasedFieldPrinterParser implements DateTimePrinterParser {
...
private DateTimePrinterParser printerParser(Locale locale) {
WeekFields weekDef = WeekFields.of(locale);
TemporalField field = null;
switch (chr) {
case 'Y':
field = weekDef.weekBasedYear();
if (count == 2) {
return new ReducedPrinterParser(field, 2, 2, 0, ReducedPrinterParser.BASE_DATE, 0);
} else {
return new NumberPrinterParser(field, count, 19,
(count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD, -1);
}
case 'e':
case 'c':
field = weekDef.dayOfWeek();
break;
case 'w':
field = weekDef.weekOfWeekBasedYear();
break;
case 'W':
field = weekDef.weekOfMonth();
break;
default:
throw new IllegalStateException("unreachable");
}
return new NumberPrinterParser(field, (count == 2 ? 2 : 1), 2, SignStyle.NOT_NEGATIVE);
}
...
}
...
}
İşte bir örnek
System.out.format("Conundrum : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
.format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'")));
System.out.format("Solution : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
.format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmms'S'")));
System.out.format("JVM Locale first day of week : %s%n",
WeekFields.of(Locale.getDefault()).getFirstDayOfWeek());
System.out.format("US first day of week : %s%n",
WeekFields.of(Locale.US).getFirstDayOfWeek());
System.out.format("France first day of week : %s%n",
WeekFields.of(Locale.FRANCE).getFirstDayOfWeek());
System.out.format("JVM Locale min days in 1st week : %s%n",
WeekFields.of(Locale.getDefault()).getMinimalDaysInFirstWeek());
System.out.format("US min days in 1st week : %s%n",
WeekFields.of(Locale.US).getMinimalDaysInFirstWeek());
System.out.format("JVM Locale min days in 1st week : %s%n",
WeekFields.of(Locale.FRANCE).getMinimalDaysInFirstWeek());
System.out.format("JVM Locale week based year (big Y): %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear()));
System.out.format("France week based year (big Y) : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear()));
System.out.format("US week based year (big Y) : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.US).weekBasedYear()));
Ve bir bölge ve üst kasanın konuda Y
, ya komut satırı seçeneği ile oynayabilir -Duser.language=
( fr
, en
, es
vb) veya çağırma anda yerel zorlamak:
System.out.format("English localized : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
.format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.ENGLISH)));
System.out.format("French localized : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
.format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.FRENCH)));