Skip to content

Commit d8e8156

Browse files
ummelsnicolasstucki
authored andcommitted
Fix #1966: ChronoUnit and ChronoField
1 parent 85e49df commit d8e8156

File tree

2 files changed

+76
-58
lines changed

2 files changed

+76
-58
lines changed

src/main/scala/java/time/temporal/ChronoField.scala

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package java.time.temporal
22

33
final class ChronoField private (name: String, ordinal: Int,
4-
_range: ValueRange, dateBased: Boolean, baseUnit: ChronoUnit,
5-
rangeUnit: ChronoUnit) extends Enum[ChronoField](name, ordinal)
6-
with TemporalField {
4+
_range: ValueRange, baseUnit: ChronoUnit, rangeUnit: ChronoUnit, flags: Int)
5+
extends Enum[ChronoField](name, ordinal) with TemporalField {
6+
7+
import ChronoField._
78

89
// Not implemented:
910
// def String getDisplayName(locale: java.util.Locale)
@@ -14,9 +15,9 @@ final class ChronoField private (name: String, ordinal: Int,
1415

1516
def range(): ValueRange = _range
1617

17-
def isDateBased(): Boolean = dateBased
18+
def isDateBased(): Boolean = (flags & isDateBasedFlag) != 0
1819

19-
def isTimeBased(): Boolean = !dateBased
20+
def isTimeBased(): Boolean = (flags & isTimeBasedFlag) != 0
2021

2122
def checkValidValue(value: Long): Long =
2223
_range.checkValidValue(value, this)
@@ -40,95 +41,98 @@ object ChronoField {
4041

4142
import ChronoUnit._
4243

44+
private final val isTimeBasedFlag = 1
45+
private final val isDateBasedFlag = 2
46+
4347
final val NANO_OF_SECOND = new ChronoField("NanoOfSecond", 0,
44-
ValueRange.of(0, 999999999), false, NANOS, SECONDS)
48+
ValueRange.of(0, 999999999), NANOS, SECONDS, isTimeBasedFlag)
4549

4650
final val NANO_OF_DAY = new ChronoField("NanoOfDay", 1,
47-
ValueRange.of(0, 86399999999999L), false, NANOS, DAYS)
51+
ValueRange.of(0, 86399999999999L), NANOS, DAYS, isTimeBasedFlag)
4852

4953
final val MICRO_OF_SECOND = new ChronoField("MicroOfSecond", 2,
50-
ValueRange.of(0, 999999), false, MICROS, SECONDS)
54+
ValueRange.of(0, 999999), MICROS, SECONDS, isTimeBasedFlag)
5155

5256
final val MICRO_OF_DAY = new ChronoField("MicroOfDay", 3,
53-
ValueRange.of(0, 86399999999L), false, MICROS, DAYS)
57+
ValueRange.of(0, 86399999999L), MICROS, DAYS, isTimeBasedFlag)
5458

5559
final val MILLI_OF_SECOND = new ChronoField("MilliOfSecond", 4,
56-
ValueRange.of(0, 999), false, MILLIS, SECONDS)
60+
ValueRange.of(0, 999), MILLIS, SECONDS, isTimeBasedFlag)
5761

5862
final val MILLI_OF_DAY = new ChronoField("MilliOfDay", 5,
59-
ValueRange.of(0, 86399999), false, MILLIS, DAYS)
63+
ValueRange.of(0, 86399999), MILLIS, DAYS, isTimeBasedFlag)
6064

6165
final val SECOND_OF_MINUTE = new ChronoField("SecondOfMinute", 6,
62-
ValueRange.of(0, 59), false, SECONDS, MINUTES)
66+
ValueRange.of(0, 59), SECONDS, MINUTES, isTimeBasedFlag)
6367

6468
final val SECOND_OF_DAY = new ChronoField("SecondOfDay", 7,
65-
ValueRange.of(0, 86399), false, SECONDS, DAYS)
69+
ValueRange.of(0, 86399), SECONDS, DAYS, isTimeBasedFlag)
6670

6771
final val MINUTE_OF_HOUR = new ChronoField("MinuteOfHour", 8,
68-
ValueRange.of(0, 59), false, MINUTES, HOURS)
72+
ValueRange.of(0, 59), MINUTES, HOURS, isTimeBasedFlag)
6973

7074
final val MINUTE_OF_DAY = new ChronoField("MinuteOfDay", 9,
71-
ValueRange.of(0, 1439), false, MINUTES, DAYS)
75+
ValueRange.of(0, 1439), MINUTES, DAYS, isTimeBasedFlag)
7276

7377
final val HOUR_OF_AMPM = new ChronoField("HourOfAmPm", 10,
74-
ValueRange.of(0, 11), false, HOURS, HALF_DAYS)
78+
ValueRange.of(0, 11), HOURS, HALF_DAYS, isTimeBasedFlag)
7579

7680
final val CLOCK_HOUR_OF_AMPM = new ChronoField("ClockHourOfAmPm", 11,
77-
ValueRange.of(1, 12), false, HOURS, HALF_DAYS)
81+
ValueRange.of(1, 12), HOURS, HALF_DAYS, isTimeBasedFlag)
7882

7983
final val HOUR_OF_DAY = new ChronoField("HourOfDay", 12,
80-
ValueRange.of(0, 23), false, HOURS, DAYS)
84+
ValueRange.of(0, 23), HOURS, DAYS, isTimeBasedFlag)
8185

8286
final val CLOCK_HOUR_OF_DAY = new ChronoField("ClockHourOfDay", 13,
83-
ValueRange.of(1, 24), false, HOURS, DAYS)
87+
ValueRange.of(1, 24), HOURS, DAYS, isTimeBasedFlag)
8488

8589
final val AMPM_OF_DAY = new ChronoField("AmPmOfDay", 14,
86-
ValueRange.of(0, 1), false, HALF_DAYS, DAYS)
90+
ValueRange.of(0, 1), HALF_DAYS, DAYS, isTimeBasedFlag)
8791

8892
final val DAY_OF_WEEK = new ChronoField("DayOfWeek", 15,
89-
ValueRange.of(1, 7), true, DAYS, WEEKS)
93+
ValueRange.of(1, 7), DAYS, WEEKS, isDateBasedFlag)
9094

9195
final val ALIGNED_DAY_OF_WEEK_IN_MONTH = new ChronoField("AlignedDayOfWeekInMonth",
92-
16, ValueRange.of(1, 7), true, DAYS, WEEKS)
96+
16, ValueRange.of(1, 7), DAYS, WEEKS, isDateBasedFlag)
9397

9498
final val ALIGNED_DAY_OF_WEEK_IN_YEAR = new ChronoField("AlignedDayOfWeekInYear",
95-
17, ValueRange.of(1, 7), true, DAYS, WEEKS)
99+
17, ValueRange.of(1, 7), DAYS, WEEKS, isDateBasedFlag)
96100

97101
final val DAY_OF_MONTH = new ChronoField("DayOfMonth", 18,
98-
ValueRange.of(1, 28, 31), true, DAYS, MONTHS)
102+
ValueRange.of(1, 28, 31), DAYS, MONTHS, isDateBasedFlag)
99103

100104
final val DAY_OF_YEAR = new ChronoField("DayOfYear", 19,
101-
ValueRange.of(1, 365, 366), true, DAYS, YEARS)
105+
ValueRange.of(1, 365, 366), DAYS, YEARS, isDateBasedFlag)
102106

103107
final val EPOCH_DAY = new ChronoField("EpochDay", 20,
104-
ValueRange.of(-365249999634L, 365249999634L), true, DAYS, FOREVER)
108+
ValueRange.of(-365249999634L, 365249999634L), DAYS, FOREVER, isDateBasedFlag)
105109

106110
final val ALIGNED_WEEK_OF_MONTH = new ChronoField("AlignedWeekOfMonth", 21,
107-
ValueRange.of(1, 4, 5), true, WEEKS, MONTHS)
111+
ValueRange.of(1, 4, 5), WEEKS, MONTHS, isDateBasedFlag)
108112

109113
final val ALIGNED_WEEK_OF_YEAR = new ChronoField("AlignedWeekOfYear", 22,
110-
ValueRange.of(1, 53), true, WEEKS, YEARS)
114+
ValueRange.of(1, 53), WEEKS, YEARS, isDateBasedFlag)
111115

112116
final val MONTH_OF_YEAR = new ChronoField("MonthOfYear", 23,
113-
ValueRange.of(1, 12), true, MONTHS, YEARS)
117+
ValueRange.of(1, 12), MONTHS, YEARS, isDateBasedFlag)
114118

115119
final val PROLEPTIC_MONTH = new ChronoField("ProlepticMonth", 24,
116-
ValueRange.of(-11999999988L, 11999999999L), true, MONTHS, FOREVER)
120+
ValueRange.of(-11999999988L, 11999999999L), MONTHS, FOREVER, isDateBasedFlag)
117121

118122
final val YEAR_OF_ERA = new ChronoField("YearOfEra", 25,
119-
ValueRange.of(1, 999999999, 1000000000), true, YEARS, ERAS)
123+
ValueRange.of(1, 999999999, 1000000000), YEARS, ERAS, isDateBasedFlag)
120124

121125
final val YEAR = new ChronoField("Year", 26,
122-
ValueRange.of(-999999999, 999999999), true, YEARS, FOREVER)
126+
ValueRange.of(-999999999, 999999999), YEARS, FOREVER, isDateBasedFlag)
123127

124-
final val ERA = new ChronoField("Era", 27, ValueRange.of(0, 1), true, ERAS,
125-
FOREVER)
128+
final val ERA = new ChronoField("Era", 27, ValueRange.of(0, 1), ERAS, FOREVER,
129+
isDateBasedFlag)
126130

127131
final val INSTANT_SECONDS = new ChronoField("InstantSeconds", 28,
128-
ValueRange.of(Long.MinValue, Long.MaxValue), false, SECONDS, FOREVER)
132+
ValueRange.of(Long.MinValue, Long.MaxValue), SECONDS, FOREVER, 0)
129133

130134
final val OFFSET_SECONDS = new ChronoField("OffsetSeconds", 29,
131-
ValueRange.of(-64800, 64800), false, SECONDS, FOREVER)
135+
ValueRange.of(-64800, 64800), SECONDS, FOREVER, 0)
132136

133137
private val fields = Array(NANO_OF_SECOND, NANO_OF_DAY, MICRO_OF_SECOND,
134138
MICRO_OF_DAY, MILLI_OF_SECOND, MILLI_OF_DAY, SECOND_OF_MINUTE,

src/main/scala/java/time/temporal/ChronoUnit.scala

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@ package java.time.temporal
33
import java.time.Duration
44

55
final class ChronoUnit private (name: String, ordinal: Int, duration: Duration,
6-
dateBased: Boolean) extends Enum[ChronoUnit](name, ordinal)
7-
with TemporalUnit {
6+
flags: Int) extends Enum[ChronoUnit](name, ordinal) with TemporalUnit {
7+
8+
import ChronoUnit._
89

910
def getDuration(): Duration = duration
1011

11-
def isDurationEstimated(): Boolean = dateBased
12+
def isDurationEstimated(): Boolean = (flags & isTimeBasedFlag) == 0
1213

13-
def isDateBased(): Boolean = dateBased
14+
def isDateBased(): Boolean = (flags & isDateBasedFlag) != 0
1415

15-
def isTimeBased(): Boolean = !dateBased
16+
def isTimeBased(): Boolean = (flags & isTimeBasedFlag) != 0
1617

1718
override def isSupportedBy(temporal: Temporal): Boolean =
1819
temporal.isSupported(this)
@@ -24,41 +25,54 @@ final class ChronoUnit private (name: String, ordinal: Int, duration: Duration,
2425
}
2526

2627
object ChronoUnit {
27-
final val NANOS = new ChronoUnit("Nanos", 0, Duration.OneNano, false)
28+
private final val isTimeBasedFlag = 1
29+
private final val isDateBasedFlag = 2
30+
31+
final val NANOS =
32+
new ChronoUnit("Nanos", 0, Duration.OneNano, isTimeBasedFlag)
2833

29-
final val MICROS = new ChronoUnit("Micros", 1, Duration.OneMicro, false)
34+
final val MICROS =
35+
new ChronoUnit("Micros", 1, Duration.OneMicro, isTimeBasedFlag)
3036

31-
final val MILLIS = new ChronoUnit("Millis", 2, Duration.OneMilli, false)
37+
final val MILLIS =
38+
new ChronoUnit("Millis", 2, Duration.OneMilli, isTimeBasedFlag)
3239

33-
final val SECONDS = new ChronoUnit("Seconds", 3, Duration.OneSecond, false)
40+
final val SECONDS =
41+
new ChronoUnit("Seconds", 3, Duration.OneSecond, isTimeBasedFlag)
3442

35-
final val MINUTES = new ChronoUnit("Minutes", 4, Duration.OneMinute, false)
43+
final val MINUTES =
44+
new ChronoUnit("Minutes", 4, Duration.OneMinute, isTimeBasedFlag)
3645

37-
final val HOURS = new ChronoUnit("Hours", 5, Duration.OneHour, false)
46+
final val HOURS =
47+
new ChronoUnit("Hours", 5, Duration.OneHour, isTimeBasedFlag)
3848

39-
final val HALF_DAYS = new ChronoUnit("HalfDays", 6, Duration.ofHours(12), false)
49+
final val HALF_DAYS =
50+
new ChronoUnit("HalfDays", 6, Duration.ofHours(12), isTimeBasedFlag)
4051

41-
final val DAYS = new ChronoUnit("Days", 7, Duration.OneDay, true)
52+
final val DAYS = new ChronoUnit("Days", 7, Duration.OneDay, isDateBasedFlag)
4253

43-
final val WEEKS = new ChronoUnit("Weeks", 8, Duration.OneWeek, true)
54+
final val WEEKS =
55+
new ChronoUnit("Weeks", 8, Duration.OneWeek, isDateBasedFlag)
4456

45-
final val MONTHS = new ChronoUnit("Months", 9, Duration.OneMonth, true)
57+
final val MONTHS =
58+
new ChronoUnit("Months", 9, Duration.OneMonth, isDateBasedFlag)
4659

47-
final val YEARS = new ChronoUnit("Years", 10, Duration.OneYear, true)
60+
final val YEARS =
61+
new ChronoUnit("Years", 10, Duration.OneYear, isDateBasedFlag)
4862

4963
final val DECADES = new ChronoUnit("Decades", 11,
50-
Duration.OneYear.multipliedBy(10), true)
64+
Duration.OneYear.multipliedBy(10), isDateBasedFlag)
5165

5266
final val CENTURIES = new ChronoUnit("Centuries", 12,
53-
Duration.OneYear.multipliedBy(100), true)
67+
Duration.OneYear.multipliedBy(100), isDateBasedFlag)
5468

55-
final val MILLENNIA = new ChronoUnit("Millenia", 13,
56-
Duration.OneYear.multipliedBy(1000), true)
69+
final val MILLENNIA = new ChronoUnit("Millennia", 13,
70+
Duration.OneYear.multipliedBy(1000), isDateBasedFlag)
5771

5872
final val ERAS = new ChronoUnit("Eras", 14,
59-
Duration.OneYear.multipliedBy(1000000000), true)
73+
Duration.OneYear.multipliedBy(1000000000), isDateBasedFlag)
6074

61-
final val FOREVER = new ChronoUnit("Forever", 15, Duration.Max, true)
75+
final val FOREVER = new ChronoUnit("Forever", 15, Duration.Max, 0)
6276

6377
private val units =
6478
Array(NANOS, MICROS, MILLIS, SECONDS, MINUTES, HOURS, HALF_DAYS, DAYS,

0 commit comments

Comments
 (0)