Hier ist ein Java 8-Update mit etwas Code, da GregorianCalendar wahrscheinlich veraltet oder aus zukünftigen JDK-Versionen entfernt wird.
Der neue Code wird in der WeekFields
Klasse und speziell für Klein- y
/ Großbuchstaben Y
mit dem weekBasedYear()
Feldzugriff behandelt.
Gibt ein Feld zurück, um auf das Jahr eines wochenbasierten Jahres zuzugreifen, das auf diesen WeekFields basiert. Dies ist das Konzept des Jahres, in dem Wochen an einem festen Wochentag wie Montag beginnen und jede Woche genau einem Jahr angehört. Dieses Feld wird normalerweise mit dayOfWeek () und weekOfWeekBasedYear () verwendet.
Woche eins (1) ist die Woche, die am getFirstDayOfWeek () beginnt, an dem es mindestens getMinimalDaysInFirstWeek () Tage im Jahr gibt. Somit kann die erste Woche vor Jahresbeginn beginnen. Wenn die erste Woche nach Jahresbeginn beginnt, liegt der vorherige Zeitraum in der letzten Woche des Vorjahres.
Dieses Feld kann mit jedem Kalendersystem verwendet werden.
In der Auflösungsphase des Parsens kann ein Datum aus einem wochenbasierten Jahr, einer Woche des Jahres und einem Wochentag erstellt werden.
Im strengen Modus werden alle drei Felder anhand ihres Bereichs gültiger Werte überprüft. Das Feld für die Woche des Jahres wird validiert, um sicherzustellen, dass das resultierende wochenbasierte Jahr das angeforderte wochenbasierte Jahr ist.
Im Smart-Modus werden alle drei Felder anhand ihres Gültigkeitsbereichs überprüft. Das Feld Woche für Woche basiert auf 1 bis 53, was bedeutet, dass das resultierende Datum im folgenden wochenbasierten Jahr bis zu dem angegebenen Datum liegen kann.
Im milden Modus werden das Jahr und der Wochentag anhand des Bereichs gültiger Werte validiert. Das resultierende Datum wird entsprechend dem folgenden dreistufigen Ansatz berechnet. Erstellen Sie zunächst ein Datum am ersten Tag der ersten Woche im angeforderten wochenbasierten Jahr. Nehmen Sie dann das wochenwochenbasierte Jahr, subtrahieren Sie eines und addieren Sie den Betrag in Wochen zum Datum. Stellen Sie schließlich den richtigen Wochentag innerhalb der lokalisierten Woche ein.
Die Einrichtung dieser WeekFields
Instanz hängt vom Gebietsschema ab und kann je nach Gebietsschema unterschiedliche Einstellungen haben. US-amerikanische und europäische Länder wie Frankreich haben möglicherweise einen anderen Tag als Wochenbeginn.
DateFormatterBuilder
Instanziieren Sie beispielsweise in Java 8 den Parser mit dem Gebietsschema und verwenden Sie dieses Gebietsschema für das Y
Symbol:
public final class DateTimeFormatterBuilder {
...
private void parsePattern(String pattern) {
...
} else if (cur == 'Y') {
// Fields defined by Locale
appendInternal(new WeekBasedFieldPrinterParser(cur, count));
} else {
...
static final class WeekBasedFieldPrinterParser implements DateTimePrinterParser {
...
/**
* Gets the printerParser to use based on the field and the locale.
*
* @param locale the locale to use, not null
* @return the formatter, not null
* @throws IllegalArgumentException if the formatter cannot be found
*/
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);
}
...
}
...
}
Hier ist ein Beispiel
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()));
Und in Bezug des Lokals und das obere Gehäuse Y
, können Sie entweder mit der Kommandozeilenoption spielen -Duser.language=
( fr
, en
, es
, usw.) oder zwingen , die locale beim Aufruf Zeit:
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)));