mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 22:34:27 +02:00
8279185: Support for IsoFields in JapaneseDate/MinguoDate/ThaiBuddhistDate
Reviewed-by: joehw, rriggs
This commit is contained in:
parent
ac274c4ca6
commit
ef7a9f8170
13 changed files with 272 additions and 38 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -76,6 +76,7 @@ import java.time.format.DateTimeFormatterBuilder;
|
|||
import java.time.format.ResolverStyle;
|
||||
import java.time.format.TextStyle;
|
||||
import java.time.temporal.ChronoField;
|
||||
import java.time.temporal.IsoFields;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.time.temporal.TemporalField;
|
||||
import java.time.temporal.TemporalQueries;
|
||||
|
@ -736,7 +737,7 @@ public interface Chronology extends Comparable<Chronology> {
|
|||
* @throws DateTimeException if any of the values are out of range
|
||||
* @since 9
|
||||
*/
|
||||
public default long epochSecond(int prolepticYear, int month, int dayOfMonth,
|
||||
default long epochSecond(int prolepticYear, int month, int dayOfMonth,
|
||||
int hour, int minute, int second, ZoneOffset zoneOffset) {
|
||||
Objects.requireNonNull(zoneOffset, "zoneOffset");
|
||||
HOUR_OF_DAY.checkValidValue(hour);
|
||||
|
@ -765,11 +766,38 @@ public interface Chronology extends Comparable<Chronology> {
|
|||
* @throws DateTimeException if any of the values are out of range
|
||||
* @since 9
|
||||
*/
|
||||
public default long epochSecond(Era era, int yearOfEra, int month, int dayOfMonth,
|
||||
default long epochSecond(Era era, int yearOfEra, int month, int dayOfMonth,
|
||||
int hour, int minute, int second, ZoneOffset zoneOffset) {
|
||||
Objects.requireNonNull(era, "era");
|
||||
return epochSecond(prolepticYear(era, yearOfEra), month, dayOfMonth, hour, minute, second, zoneOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this chronology is ISO based.
|
||||
* <p>
|
||||
* An ISO based chronology has the same basic structure as the {@link IsoChronology
|
||||
* ISO chronology}, i.e., the chronology has the same number of months, the number
|
||||
* of days in each month, and day-of-year and leap years are the same as ISO chronology.
|
||||
* It also supports the concept of week-based-year of ISO chronology.
|
||||
* For example, the {@link MinguoChronology Minguo}, {@link ThaiBuddhistChronology
|
||||
* ThaiThaiBuddhist} and {@link JapaneseChronology Japanese} chronologies are ISO based.
|
||||
*
|
||||
* @implSpec
|
||||
* The default implementation returns {@code false}.
|
||||
*
|
||||
* @return {@code true} only if all the fields of {@link IsoFields} are supported by
|
||||
* this chronology. Otherwise, returns {@code false}.
|
||||
* @see IsoChronology
|
||||
* @see JapaneseChronology
|
||||
* @see MinguoChronology
|
||||
* @see ThaiBuddhistChronology
|
||||
* @see IsoFields
|
||||
* @since 19
|
||||
*/
|
||||
default boolean isIsoBased() {
|
||||
return false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
/**
|
||||
* Compares this chronology to another chronology.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -87,6 +87,7 @@ import java.time.ZoneId;
|
|||
import java.time.ZoneOffset;
|
||||
import java.time.format.ResolverStyle;
|
||||
import java.time.temporal.ChronoField;
|
||||
import java.time.temporal.IsoFields;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.time.temporal.TemporalField;
|
||||
import java.time.temporal.ValueRange;
|
||||
|
@ -677,6 +678,20 @@ public final class IsoChronology extends AbstractChronology implements Serializa
|
|||
return Period.of(years, months, days);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
/**
|
||||
* {@code IsoChronology} is an ISO based chronology, which supports fields
|
||||
* in {@link IsoFields}, such as {@link IsoFields#DAY_OF_QUARTER DAY_OF_QUARTER}
|
||||
* and {@link IsoFields#QUARTER_OF_YEAR QUARTER_OF_YEAR}.
|
||||
* @see IsoFields
|
||||
* @return {@code true}
|
||||
* @since 19
|
||||
*/
|
||||
@Override
|
||||
public boolean isIsoBased() {
|
||||
return true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
/**
|
||||
* Writes the Chronology using a
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -76,6 +76,7 @@ import java.time.Year;
|
|||
import java.time.ZoneId;
|
||||
import java.time.format.ResolverStyle;
|
||||
import java.time.temporal.ChronoField;
|
||||
import java.time.temporal.IsoFields;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.time.temporal.TemporalAdjusters;
|
||||
import java.time.temporal.TemporalField;
|
||||
|
@ -504,6 +505,20 @@ public final class JapaneseChronology extends AbstractChronology implements Seri
|
|||
return dateYearDay(era, yoe, doy); // smart is same as strict
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
/**
|
||||
* {@code JapaneseChronology} is an ISO based chronology, which supports fields
|
||||
* in {@link IsoFields}, such as {@link IsoFields#DAY_OF_QUARTER DAY_OF_QUARTER}
|
||||
* and {@link IsoFields#QUARTER_OF_YEAR QUARTER_OF_YEAR}.
|
||||
* @see IsoFields
|
||||
* @return {@code true}
|
||||
* @since 19
|
||||
*/
|
||||
@Override
|
||||
public boolean isIsoBased() {
|
||||
return true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
/**
|
||||
* Writes the Chronology using a
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -465,13 +465,13 @@ public final class JapaneseDate
|
|||
|
||||
@Override
|
||||
public long getLong(TemporalField field) {
|
||||
if (field instanceof ChronoField) {
|
||||
if (field instanceof ChronoField cf) {
|
||||
// same as ISO:
|
||||
// DAY_OF_WEEK, DAY_OF_MONTH, EPOCH_DAY, MONTH_OF_YEAR, PROLEPTIC_MONTH, YEAR
|
||||
//
|
||||
// calendar specific fields
|
||||
// DAY_OF_YEAR, YEAR_OF_ERA, ERA
|
||||
switch ((ChronoField) field) {
|
||||
switch (cf) {
|
||||
case ALIGNED_DAY_OF_WEEK_IN_MONTH:
|
||||
case ALIGNED_DAY_OF_WEEK_IN_YEAR:
|
||||
case ALIGNED_WEEK_OF_MONTH:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -69,6 +69,7 @@ import java.time.LocalDate;
|
|||
import java.time.ZoneId;
|
||||
import java.time.format.ResolverStyle;
|
||||
import java.time.temporal.ChronoField;
|
||||
import java.time.temporal.IsoFields;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.time.temporal.TemporalField;
|
||||
import java.time.temporal.ValueRange;
|
||||
|
@ -335,6 +336,20 @@ public final class MinguoChronology extends AbstractChronology implements Serial
|
|||
return (MinguoDate) super.resolveDate(fieldValues, resolverStyle);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
/**
|
||||
* {@code MinguoChronology} is an ISO based chronology, which supports fields
|
||||
* in {@link IsoFields}, such as {@link IsoFields#DAY_OF_QUARTER DAY_OF_QUARTER}
|
||||
* and {@link IsoFields#QUARTER_OF_YEAR QUARTER_OF_YEAR}.
|
||||
* @see IsoFields
|
||||
* @return {@code true}
|
||||
* @since 19
|
||||
*/
|
||||
@Override
|
||||
public boolean isIsoBased() {
|
||||
return true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
/**
|
||||
* Writes the Chronology using a
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -69,6 +69,7 @@ import java.time.LocalDate;
|
|||
import java.time.ZoneId;
|
||||
import java.time.format.ResolverStyle;
|
||||
import java.time.temporal.ChronoField;
|
||||
import java.time.temporal.IsoFields;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.time.temporal.TemporalField;
|
||||
import java.time.temporal.ValueRange;
|
||||
|
@ -335,6 +336,20 @@ public final class ThaiBuddhistChronology extends AbstractChronology implements
|
|||
return (ThaiBuddhistDate) super.resolveDate(fieldValues, resolverStyle);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
/**
|
||||
* {@code ThaiBuddhistChronology} is an ISO based chronology, which supports fields
|
||||
* in {@link IsoFields}, such as {@link IsoFields#DAY_OF_QUARTER DAY_OF_QUARTER}
|
||||
* and {@link IsoFields#QUARTER_OF_YEAR QUARTER_OF_YEAR}.
|
||||
* @see IsoFields
|
||||
* @return {@code true}
|
||||
* @since 19
|
||||
*/
|
||||
@Override
|
||||
public boolean isIsoBased() {
|
||||
return true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
/**
|
||||
* Writes the Chronology using a
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -546,7 +546,10 @@ public final class IsoFields {
|
|||
if (isSupportedBy(temporal) == false) {
|
||||
throw new UnsupportedTemporalTypeException("Unsupported field: WeekBasedYear");
|
||||
}
|
||||
return super.rangeRefinedBy(temporal);
|
||||
var range = super.rangeRefinedBy(temporal);
|
||||
var chronoRange = Chronology.from(temporal).range(YEAR);
|
||||
return ValueRange.of(Math.max(range.getMinimum(), chronoRange.getMinimum()),
|
||||
Math.min(range.getMaximum(), chronoRange.getMaximum()));
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
|
@ -591,12 +594,6 @@ public final class IsoFields {
|
|||
private static final int[] QUARTER_DAYS = {0, 90, 181, 273, 0, 91, 182, 274};
|
||||
|
||||
|
||||
private static void ensureIso(TemporalAccessor temporal) {
|
||||
if (isIso(temporal) == false) {
|
||||
throw new DateTimeException("Resolve requires IsoChronology");
|
||||
}
|
||||
}
|
||||
|
||||
private static ValueRange getWeekRange(LocalDate date) {
|
||||
int wby = getWeekBasedYear(date);
|
||||
return ValueRange.of(1, getWeekRange(wby));
|
||||
|
@ -731,7 +728,14 @@ public final class IsoFields {
|
|||
}
|
||||
}
|
||||
|
||||
static boolean isIso(TemporalAccessor temporal) {
|
||||
return Chronology.from(temporal).equals(IsoChronology.INSTANCE);
|
||||
private static void ensureIso(TemporalAccessor temporal) {
|
||||
if (!isIso(temporal)) {
|
||||
throw new DateTimeException("Resolve requires ISO based chronology: " +
|
||||
Chronology.from(temporal));
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isIso(TemporalAccessor temporal) {
|
||||
return Chronology.from(temporal).isIsoBased();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue