@js-joda/core 1.12.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -1
- package/dist/js-joda.d.ts +2377 -1635
- package/dist/js-joda.esm.js +1678 -653
- package/dist/js-joda.js +1681 -654
- package/dist/js-joda.js.map +1 -1
- package/dist/js-joda.min.js +2 -2
- package/package.json +24 -21
- package/src/DayOfWeek.js +3 -3
- package/src/Duration.js +4 -4
- package/src/Instant.js +12 -54
- package/src/LocalDate.js +26 -75
- package/src/LocalDateTime.js +10 -62
- package/src/LocalTime.js +8 -61
- package/src/Month.js +4 -4
- package/src/MonthDay.js +1 -2
- package/src/OffsetDateTime.js +757 -0
- package/src/OffsetTime.js +621 -0
- package/src/Period.js +1 -1
- package/src/Year.js +73 -57
- package/src/YearMonth.js +10 -68
- package/src/ZonedDateTime.js +11 -52
- package/src/_init.js +4 -0
- package/src/chrono/ChronoLocalDate.js +2 -2
- package/src/chrono/ChronoLocalDateTime.js +2 -2
- package/src/chrono/ChronoZonedDateTime.js +2 -2
- package/src/errors.js +6 -6
- package/src/format/DateTimeBuilder.js +2 -2
- package/src/format/DateTimeFormatter.js +3 -3
- package/src/js-joda.js +6 -0
- package/src/temporal/ChronoField.js +241 -133
- package/src/temporal/ChronoUnit.js +72 -229
- package/src/temporal/DefaultInterfaceTemporal.js +118 -0
- package/src/temporal/IsoFields.js +35 -32
- package/src/temporal/Temporal.js +284 -1
- package/src/temporal/TemporalField.js +225 -1
- package/src/temporal/TemporalUnit.js +18 -19
- package/src/temporal/ValueRange.js +1 -0
|
@@ -0,0 +1,621 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright (c) 2016-present, Philipp Thürwächter & Pattrick Hüper & js-joda contributors
|
|
3
|
+
* @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
|
|
4
|
+
* @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {ChronoField} from './temporal/ChronoField';
|
|
8
|
+
import {ChronoUnit} from './temporal/ChronoUnit';
|
|
9
|
+
import {Clock} from './Clock';
|
|
10
|
+
import {DateTimeException, UnsupportedTemporalTypeException} from './errors';
|
|
11
|
+
import {DateTimeFormatter} from './format/DateTimeFormatter';
|
|
12
|
+
import {DefaultInterfaceTemporal} from './temporal/DefaultInterfaceTemporal';
|
|
13
|
+
import {Instant, LocalTime} from './js-joda';
|
|
14
|
+
import {MathUtil} from './MathUtil';
|
|
15
|
+
import {OffsetDateTime} from './OffsetDateTime';
|
|
16
|
+
import {TemporalQueries} from './temporal/TemporalQueries';
|
|
17
|
+
import {ZoneId} from './ZoneId';
|
|
18
|
+
import {ZoneOffset} from './ZoneOffset';
|
|
19
|
+
|
|
20
|
+
import {createTemporalQuery} from './temporal/TemporalQuery';
|
|
21
|
+
import {requireInstance, requireNonNull} from './assert';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A time with an offset from UTC/Greenwich in the ISO-8601 calendar system, such as 10:15:30+01:00.
|
|
25
|
+
*/
|
|
26
|
+
export class OffsetTime extends DefaultInterfaceTemporal {
|
|
27
|
+
/**
|
|
28
|
+
* @param {!TemporalAccessor} temporal
|
|
29
|
+
* @return {OffsetTime}
|
|
30
|
+
*/
|
|
31
|
+
static from(temporal) {
|
|
32
|
+
requireNonNull(temporal, 'temporal');
|
|
33
|
+
if (temporal instanceof OffsetTime) {
|
|
34
|
+
return temporal;
|
|
35
|
+
} else if (temporal instanceof OffsetDateTime) {
|
|
36
|
+
return temporal.toOffsetTime();
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const time = LocalTime.from(temporal);
|
|
40
|
+
const offset = ZoneOffset.from(temporal);
|
|
41
|
+
return new OffsetTime(time, offset);
|
|
42
|
+
} catch(ex) {
|
|
43
|
+
throw new DateTimeException(`Unable to obtain OffsetTime TemporalAccessor: ${temporal}, type ${temporal.constructor != null ? temporal.constructor.name : ''}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @param {Clock|ZoneId} clockOrZone
|
|
49
|
+
* @return {OffsetTime}
|
|
50
|
+
*/
|
|
51
|
+
static now(clockOrZone) {
|
|
52
|
+
if (arguments.length === 0){
|
|
53
|
+
return OffsetTime._now(Clock.systemDefaultZone());
|
|
54
|
+
} else if (clockOrZone instanceof Clock){
|
|
55
|
+
return OffsetTime._now(clockOrZone);
|
|
56
|
+
} else {
|
|
57
|
+
return OffsetTime._now(Clock.system(clockOrZone));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param {Clock} clock - the clock to use, defaults to Clock.systemDefaultZone()
|
|
63
|
+
* @return {OffsetTime} the current offset date-time, not null
|
|
64
|
+
*/
|
|
65
|
+
static _now(clock) {
|
|
66
|
+
requireNonNull(clock, 'clock');
|
|
67
|
+
const now = clock.instant();
|
|
68
|
+
return OffsetTime.ofInstant(now, clock.zone().rules().offset(now));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @return {OffsetTime}
|
|
73
|
+
*/
|
|
74
|
+
static of(){
|
|
75
|
+
if (arguments.length <= 2) {
|
|
76
|
+
return OffsetTime.ofTimeAndOffset.apply(this, arguments);
|
|
77
|
+
} else {
|
|
78
|
+
return OffsetTime.ofNumbers.apply(this, arguments);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @param {int}hour
|
|
84
|
+
* @param {int}minute
|
|
85
|
+
* @param {int}second
|
|
86
|
+
* @param {int}nanoOfSecond
|
|
87
|
+
* @param {ZoneOffset}offset
|
|
88
|
+
* @return {OffsetTime}
|
|
89
|
+
*/
|
|
90
|
+
static ofNumbers(hour, minute, second, nanoOfSecond, offset) {
|
|
91
|
+
const time = LocalTime.of(hour, minute, second, nanoOfSecond);
|
|
92
|
+
return new OffsetTime(time, offset);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @param {LocalTime}time
|
|
97
|
+
* @param {ZoneOffset}offset
|
|
98
|
+
* @return {OffsetTime}
|
|
99
|
+
*/
|
|
100
|
+
static ofTimeAndOffset(time, offset) {
|
|
101
|
+
return new OffsetTime(time, offset);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @param {!Instant} instant
|
|
106
|
+
* @param {!ZoneId} zone
|
|
107
|
+
* @return {!OffsetTime}
|
|
108
|
+
*/
|
|
109
|
+
static ofInstant( instant, zone){
|
|
110
|
+
requireNonNull(instant, 'instant');
|
|
111
|
+
requireInstance(instant, Instant, 'instant');
|
|
112
|
+
requireNonNull(zone, 'zone');
|
|
113
|
+
requireInstance(zone, ZoneId, 'zone');
|
|
114
|
+
|
|
115
|
+
const rules = zone.rules();
|
|
116
|
+
const offset = rules.offset(instant);
|
|
117
|
+
let secsOfDay = instant.epochSecond() % LocalTime.SECONDS_PER_DAY;
|
|
118
|
+
secsOfDay = (secsOfDay + offset.totalSeconds()) % LocalTime.SECONDS_PER_DAY;
|
|
119
|
+
if (secsOfDay < 0) {
|
|
120
|
+
secsOfDay += LocalTime.SECONDS_PER_DAY;
|
|
121
|
+
}
|
|
122
|
+
const time = LocalTime.ofSecondOfDay(secsOfDay, instant.nano());
|
|
123
|
+
return new OffsetTime(time, offset);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* @param {string} text
|
|
128
|
+
* @param {DateTimeFormatter} formatter
|
|
129
|
+
* @return {OffsetTime}
|
|
130
|
+
*/
|
|
131
|
+
static parse(text, formatter= DateTimeFormatter.ISO_OFFSET_TIME) {
|
|
132
|
+
requireNonNull(formatter, 'formatter');
|
|
133
|
+
return formatter.parse(text, OffsetTime.FROM);
|
|
134
|
+
}
|
|
135
|
+
//-----------------------------------------------------------------------
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* @param {LocalTime} time
|
|
139
|
+
* @param {ZoneOffset} offset
|
|
140
|
+
* @private
|
|
141
|
+
*/
|
|
142
|
+
constructor(time, offset) {
|
|
143
|
+
super();
|
|
144
|
+
requireNonNull(time, 'time');
|
|
145
|
+
requireInstance(time, LocalTime, 'time');
|
|
146
|
+
requireNonNull(offset, 'offset');
|
|
147
|
+
requireInstance(offset, ZoneOffset, 'offset');
|
|
148
|
+
this._time = time;
|
|
149
|
+
this._offset = offset;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @param {TemporalAdjuster} temporal - the target object to be adjusted, not null
|
|
155
|
+
* @return {Temporal} the adjusted object, not null
|
|
156
|
+
* @throws {DateTimeException} if unable to make the adjustment
|
|
157
|
+
* @throws {ArithmeticException} if numeric overflow occurs
|
|
158
|
+
*/
|
|
159
|
+
adjustInto(temporal) {
|
|
160
|
+
return temporal
|
|
161
|
+
.with(ChronoField.NANO_OF_DAY, this._time.toNanoOfDay())
|
|
162
|
+
.with(ChronoField.OFFSET_SECONDS, this.offset().totalSeconds());
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @param {LocalDate} date - the date to combine with, not null
|
|
167
|
+
* @return {OffsetDateTime} the offset date-time formed from this time and the specified date, not null
|
|
168
|
+
*/
|
|
169
|
+
atDate(date) {
|
|
170
|
+
return OffsetDateTime.of(date, this._time, this._offset);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* @param {DateTimeFormatter} formatter - the formatter to use, not null
|
|
175
|
+
* @return {string} the formatted time string, not null
|
|
176
|
+
* @throws {DateTimeException} if an error occurs during printing
|
|
177
|
+
*/
|
|
178
|
+
format(formatter) {
|
|
179
|
+
requireNonNull(formatter, 'formatter');
|
|
180
|
+
return formatter.format(this, OffsetTime.FROM);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @param {TemporalField} field - the field to get, not null
|
|
186
|
+
* @return {number} the value for the field
|
|
187
|
+
* @throws {DateTimeException} if a value for the field cannot be obtained
|
|
188
|
+
* @throws {ArithmeticException} if numeric overflow occurs
|
|
189
|
+
*/
|
|
190
|
+
get(field) {
|
|
191
|
+
return super.get(field);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* @param {TemporalField} field - the field to get, not null
|
|
196
|
+
* @return {number} the value for the field
|
|
197
|
+
* @throws {DateTimeException} if a value for the field cannot be obtained
|
|
198
|
+
* @trhows {UnsupportedTemporalTypeException}
|
|
199
|
+
* @throws {ArithmeticException} if numeric overflow occurs
|
|
200
|
+
*/
|
|
201
|
+
getLong(field) {
|
|
202
|
+
if (field instanceof ChronoField) {
|
|
203
|
+
if (field === ChronoField.OFFSET_SECONDS) {
|
|
204
|
+
return this._offset.totalSeconds();
|
|
205
|
+
}
|
|
206
|
+
return this._time.getLong(field);
|
|
207
|
+
}
|
|
208
|
+
return field.getFrom(this);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* @return {int}
|
|
213
|
+
*/
|
|
214
|
+
hour() {
|
|
215
|
+
return this._time.hour();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* @return {int}
|
|
220
|
+
*/
|
|
221
|
+
minute() {
|
|
222
|
+
return this._time.minute();
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* @return {int}
|
|
227
|
+
*/
|
|
228
|
+
second() {
|
|
229
|
+
return this._time.second();
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* @return {int}
|
|
234
|
+
*/
|
|
235
|
+
nano() {
|
|
236
|
+
return this._time.nano();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* @return {ZoneOffset}
|
|
241
|
+
*/
|
|
242
|
+
offset() {
|
|
243
|
+
return this._offset;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* @param {OffsetTime} other - the other time to compare to, not null
|
|
248
|
+
* @return {boolean} true if this is after the specified time
|
|
249
|
+
* @throws {NullPointerException} if `other` is null
|
|
250
|
+
*/
|
|
251
|
+
isAfter(other) {
|
|
252
|
+
requireNonNull(other, 'other');
|
|
253
|
+
return this._toEpochNano() > other._toEpochNano();
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* @param {OffsetTime} other - the other time to compare to, not null
|
|
258
|
+
* @return {boolean} true if this point is before the specified time
|
|
259
|
+
* @throws {NullPointerException} if `other` is null
|
|
260
|
+
*/
|
|
261
|
+
isBefore(other) {
|
|
262
|
+
requireNonNull(other, 'other');
|
|
263
|
+
return this._toEpochNano() < other._toEpochNano();
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* @param {OffsetTime} other - the other time to compare to, not null
|
|
268
|
+
* @return {boolean}
|
|
269
|
+
* @throws {NullPointerException} if `other` is null
|
|
270
|
+
*/
|
|
271
|
+
isEqual(other) {
|
|
272
|
+
requireNonNull(other, 'other');
|
|
273
|
+
return this._toEpochNano() === other._toEpochNano();
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* @param {TemporalField|TemporalUnit} fieldOrUnit - the field to check, null returns false
|
|
278
|
+
* @return {boolean} true if the field is supported on this time, false if not
|
|
279
|
+
*/
|
|
280
|
+
isSupported(fieldOrUnit) {
|
|
281
|
+
if (fieldOrUnit instanceof ChronoField) {
|
|
282
|
+
return fieldOrUnit.isTimeBased() || fieldOrUnit === ChronoField.OFFSET_SECONDS;
|
|
283
|
+
} else if (fieldOrUnit instanceof ChronoUnit) {
|
|
284
|
+
return fieldOrUnit.isTimeBased();
|
|
285
|
+
}
|
|
286
|
+
return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* @param {number} hours
|
|
291
|
+
* @return {OffsetTime}
|
|
292
|
+
*/
|
|
293
|
+
minusHours(hours) {
|
|
294
|
+
return this._withLocalTimeOffset(this._time.minusHours(hours), this._offset);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* @param {number} minutes
|
|
299
|
+
* @return {OffsetTime}
|
|
300
|
+
*/
|
|
301
|
+
minusMinutes(minutes) {
|
|
302
|
+
return this._withLocalTimeOffset(this._time.minusMinutes(minutes), this._offset);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* @param {number} seconds
|
|
307
|
+
* @return {OffsetTime}
|
|
308
|
+
*/
|
|
309
|
+
minusSeconds(seconds) {
|
|
310
|
+
return this._withLocalTimeOffset(this._time.minusSeconds(seconds), this._offset);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* @param {number} nanos
|
|
315
|
+
* @return {OffsetTime}
|
|
316
|
+
*/
|
|
317
|
+
minusNanos(nanos) {
|
|
318
|
+
return this._withLocalTimeOffset(this._time.minusNanos(nanos), this._offset);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
minusAmount(amount) {
|
|
322
|
+
requireNonNull(amount);
|
|
323
|
+
return amount.subtractFrom(this);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
minusAmountUnit(amountToSubtract, unit) {
|
|
327
|
+
return this.plus(-1 * amountToSubtract, unit);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
plusAmount(amount) {
|
|
331
|
+
requireNonNull(amount);
|
|
332
|
+
return amount.addTo(this);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
*
|
|
337
|
+
* @param amountToAdd
|
|
338
|
+
* @param unit
|
|
339
|
+
* @return {Temporal}
|
|
340
|
+
*/
|
|
341
|
+
plusAmountUnit(amountToAdd, unit) {
|
|
342
|
+
if (unit instanceof ChronoUnit) {
|
|
343
|
+
return this._withLocalTimeOffset(this._time.plus(amountToAdd, unit), this._offset);
|
|
344
|
+
}
|
|
345
|
+
return unit.addTo(this, amountToAdd);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* @param {int} hours
|
|
350
|
+
* @return {OffsetTime}
|
|
351
|
+
*/
|
|
352
|
+
plusHours(hours) {
|
|
353
|
+
return this._withLocalTimeOffset(this._time.plusHours(hours), this._offset);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* @param {int} minutes
|
|
358
|
+
* @return {OffsetTime}
|
|
359
|
+
*/
|
|
360
|
+
plusMinutes(minutes) {
|
|
361
|
+
return this._withLocalTimeOffset(this._time.plusMinutes(minutes), this._offset);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* @param {int} seconds
|
|
366
|
+
* @return {OffsetTime}
|
|
367
|
+
*/
|
|
368
|
+
plusSeconds(seconds) {
|
|
369
|
+
return this._withLocalTimeOffset(this._time.plusSeconds(seconds), this._offset);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* @param {int} nanos
|
|
374
|
+
* @return {OffsetTime}
|
|
375
|
+
*/
|
|
376
|
+
plusNanos(nanos) {
|
|
377
|
+
return this._withLocalTimeOffset(this._time.plusNanos(nanos), this._offset);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* @param {TemporalQuery} query - the query to invoke, not null
|
|
382
|
+
* @return {*} the query result, null may be returned (defined by the query)
|
|
383
|
+
* @throws {DateTimeException} if unable to query (defined by the query)
|
|
384
|
+
* @throws {ArithmeticException} if numeric overflow occurs (defined by the query)
|
|
385
|
+
*/
|
|
386
|
+
query(query) {
|
|
387
|
+
requireNonNull(query, 'query');
|
|
388
|
+
if (query === TemporalQueries.precision()) {
|
|
389
|
+
return ChronoUnit.NANOS;
|
|
390
|
+
} else if (query === TemporalQueries.offset() || query === TemporalQueries.zone()) {
|
|
391
|
+
return this.offset();
|
|
392
|
+
} else if (query === TemporalQueries.localTime()) {
|
|
393
|
+
return this._time;
|
|
394
|
+
} else if (query === TemporalQueries.chronology() || query === TemporalQueries.localDate() || query === TemporalQueries.zoneId()) {
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
return super.query(query);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* @param {TemporalField} field - the field to query the range for, not null
|
|
402
|
+
* @return {ValueRange} the range of valid values for the field, not null
|
|
403
|
+
* @throws {DateTimeException} if the range for the field cannot be obtained
|
|
404
|
+
*/
|
|
405
|
+
range(field) {
|
|
406
|
+
if (field instanceof ChronoField) {
|
|
407
|
+
if (field === ChronoField.OFFSET_SECONDS) {
|
|
408
|
+
return field.range();
|
|
409
|
+
}
|
|
410
|
+
return this._time.range(field);
|
|
411
|
+
}
|
|
412
|
+
return field.rangeRefinedBy(this);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* @return {LocalTime}
|
|
417
|
+
*/
|
|
418
|
+
toLocalTime() {
|
|
419
|
+
return this._time;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* @param {TemporalUnit} unit - the unit to truncate to, not null
|
|
424
|
+
* @return {OffsetTime} a {@link LocalTime} based on this time with the time truncated, not null
|
|
425
|
+
* @throws {DateTimeException} if unable to truncate
|
|
426
|
+
*/
|
|
427
|
+
truncatedTo(unit) {
|
|
428
|
+
return this._withLocalTimeOffset(this._time.truncatedTo(unit), this._offset);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* @param {Temporal} endExclusive - the end time, which is converted to a {@link LocalTime}, not null
|
|
433
|
+
* @param {TemporalUnit} unit - the unit to measure the period in, not null
|
|
434
|
+
* @return {number} the amount of the period between this time and the end time
|
|
435
|
+
* @throws {DateTimeException} if the period cannot be calculated
|
|
436
|
+
* @throws {ArithmeticException} if numeric overflow occurs
|
|
437
|
+
*/
|
|
438
|
+
until(endExclusive, unit) {
|
|
439
|
+
requireNonNull(endExclusive, 'endExclusive');
|
|
440
|
+
requireNonNull(unit, 'unit');
|
|
441
|
+
const end = OffsetTime.from(endExclusive);
|
|
442
|
+
if (unit instanceof ChronoUnit) {
|
|
443
|
+
const nanosUntil = end._toEpochNano() - this._toEpochNano(); // no overflow
|
|
444
|
+
switch (unit) {
|
|
445
|
+
case ChronoUnit.NANOS: return nanosUntil;
|
|
446
|
+
case ChronoUnit.MICROS: return Math.floor(nanosUntil / 1000);
|
|
447
|
+
case ChronoUnit.MILLIS: return Math.floor(nanosUntil / 1000000);
|
|
448
|
+
case ChronoUnit.SECONDS: return Math.floor(nanosUntil / LocalTime.NANOS_PER_SECOND);
|
|
449
|
+
case ChronoUnit.MINUTES: return Math.floor(nanosUntil / LocalTime.NANOS_PER_MINUTE);
|
|
450
|
+
case ChronoUnit.HOURS: return Math.floor(nanosUntil / LocalTime.NANOS_PER_HOUR);
|
|
451
|
+
case ChronoUnit.HALF_DAYS: return Math.floor(nanosUntil / (12 * LocalTime.NANOS_PER_HOUR));
|
|
452
|
+
}
|
|
453
|
+
throw new UnsupportedTemporalTypeException('Unsupported unit: ' + unit);
|
|
454
|
+
}
|
|
455
|
+
return unit.between(this, end);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* @param {int} hour
|
|
460
|
+
* @return {OffsetTime}
|
|
461
|
+
*/
|
|
462
|
+
withHour(hour) {
|
|
463
|
+
return this._withLocalTimeOffset(this._time.withHour(hour), this._offset);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* @param {int} minute
|
|
468
|
+
* @return {OffsetTime}
|
|
469
|
+
*/
|
|
470
|
+
withMinute(minute) {
|
|
471
|
+
return this._withLocalTimeOffset(this._time.withMinute(minute), this._offset);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* @param {int} second
|
|
476
|
+
* @return {OffsetTime}
|
|
477
|
+
*/
|
|
478
|
+
withSecond(second) {
|
|
479
|
+
return this._withLocalTimeOffset(this._time.withSecond(second), this._offset);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* @param {int} nano
|
|
484
|
+
* @return {OffsetTime}
|
|
485
|
+
*/
|
|
486
|
+
withNano(nano) {
|
|
487
|
+
return this._withLocalTimeOffset(this._time.withNano(nano), this._offset);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* @param {ZoneOffset} offset
|
|
492
|
+
* @return {OffsetTime}
|
|
493
|
+
*/
|
|
494
|
+
withOffsetSameInstant(offset) {
|
|
495
|
+
requireNonNull(offset, 'offset');
|
|
496
|
+
if (offset.equals(this._offset)) {
|
|
497
|
+
return this;
|
|
498
|
+
}
|
|
499
|
+
const difference = offset.totalSeconds() - this._offset.totalSeconds();
|
|
500
|
+
const adjusted = this._time.plusSeconds(difference);
|
|
501
|
+
return new OffsetTime(adjusted, offset);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* @param {ZoneOffset} offset
|
|
506
|
+
* @return {OffsetTime}
|
|
507
|
+
*/
|
|
508
|
+
withOffsetSameLocal(offset) {
|
|
509
|
+
return offset != null && offset.equals(this._offset) ? this : new OffsetTime(this._time, offset);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
_toEpochNano() {
|
|
513
|
+
const nod = this._time.toNanoOfDay();
|
|
514
|
+
const offsetNanos = this._offset.totalSeconds() * LocalTime.NANOS_PER_SECOND;
|
|
515
|
+
return nod - offsetNanos;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
withAdjuster(adjuster) {
|
|
519
|
+
requireNonNull(adjuster, 'adjuster');
|
|
520
|
+
// optimizations
|
|
521
|
+
if (adjuster instanceof LocalTime) {
|
|
522
|
+
return this._withLocalTimeOffset(adjuster, this._offset);
|
|
523
|
+
} else if (adjuster instanceof ZoneOffset) {
|
|
524
|
+
return this._withLocalTimeOffset(this._time, adjuster);
|
|
525
|
+
} else if (adjuster instanceof OffsetTime) {
|
|
526
|
+
return adjuster;
|
|
527
|
+
}
|
|
528
|
+
return adjuster.adjustInto(this);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
withFieldValue(field, newValue) {
|
|
532
|
+
requireNonNull(field, 'field');
|
|
533
|
+
if (field instanceof ChronoField) {
|
|
534
|
+
if (field === ChronoField.OFFSET_SECONDS) {
|
|
535
|
+
return this._withLocalTimeOffset(this._time, ZoneOffset.ofTotalSeconds(field.checkValidIntValue(newValue)));
|
|
536
|
+
}
|
|
537
|
+
return this._withLocalTimeOffset(this._time.with(field, newValue), this._offset);
|
|
538
|
+
}
|
|
539
|
+
return field.adjustInto(this, newValue);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* @private
|
|
544
|
+
* @param {LocalTime}time
|
|
545
|
+
* @param {ZoneOffset}offset
|
|
546
|
+
* @return {OffsetTime}
|
|
547
|
+
*/
|
|
548
|
+
_withLocalTimeOffset(time, offset) {
|
|
549
|
+
if (this._time === time && this._offset.equals(offset)) {
|
|
550
|
+
return this;
|
|
551
|
+
}
|
|
552
|
+
return new OffsetTime(time, offset);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
//---------------------------------
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* @param {OffsetTime} other - the other time to compare to, not null
|
|
559
|
+
* @return {int} the comparator value, negative if less, positive if greater
|
|
560
|
+
* @throws {NullPointerException} if `other` is null
|
|
561
|
+
*/
|
|
562
|
+
compareTo(other) {
|
|
563
|
+
requireNonNull(other, 'other');
|
|
564
|
+
requireInstance(other, OffsetTime, 'other');
|
|
565
|
+
if (this._offset.equals(other._offset)) {
|
|
566
|
+
return this._time.compareTo(other._time);
|
|
567
|
+
}
|
|
568
|
+
const compare = MathUtil.compareNumbers(this._toEpochNano(), other._toEpochNano());
|
|
569
|
+
if (compare === 0) {
|
|
570
|
+
return this._time.compareTo(other._time);
|
|
571
|
+
}
|
|
572
|
+
return compare;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* @param {*} other - the object to check, null returns false
|
|
577
|
+
* @return {boolean} true if this is equal to the other time
|
|
578
|
+
*/
|
|
579
|
+
equals(other) {
|
|
580
|
+
if (this === other) {
|
|
581
|
+
return true;
|
|
582
|
+
}
|
|
583
|
+
if (other instanceof OffsetTime) {
|
|
584
|
+
return this._time.equals(other._time) && this._offset.equals(other._offset);
|
|
585
|
+
}
|
|
586
|
+
return false;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* @return {number}
|
|
591
|
+
*/
|
|
592
|
+
hashCode() {
|
|
593
|
+
return this._time.hashCode() ^ this._offset.hashCode();
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* @return {string}
|
|
598
|
+
*/
|
|
599
|
+
toString() {
|
|
600
|
+
return this._time.toString() + this._offset.toString();
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
*
|
|
605
|
+
* @return {string} same as {@link LocalDateTime.toString}
|
|
606
|
+
*/
|
|
607
|
+
toJSON() {
|
|
608
|
+
return this.toString();
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
export function _init() {
|
|
614
|
+
OffsetTime.MIN = OffsetTime.ofNumbers(0, 0, 0,0, ZoneOffset.MAX);
|
|
615
|
+
|
|
616
|
+
OffsetTime.MAX = OffsetTime.ofNumbers(23, 59, 59,999999999, ZoneOffset.MIN);
|
|
617
|
+
|
|
618
|
+
OffsetTime.FROM = createTemporalQuery('OffsetTime.FROM', (temporal) => {
|
|
619
|
+
return OffsetTime.from(temporal);
|
|
620
|
+
});
|
|
621
|
+
}
|
package/src/Period.js
CHANGED
|
@@ -76,7 +76,7 @@ export class Period extends TemporalAmount /* extends ChronoPeriod */ {
|
|
|
76
76
|
const _months = MathUtil.safeToInt(months);
|
|
77
77
|
const _days = MathUtil.safeToInt(days);
|
|
78
78
|
|
|
79
|
-
if(
|
|
79
|
+
if( _years === 0 && _months === 0 && _days === 0 ){
|
|
80
80
|
if (!Period.ZERO) {
|
|
81
81
|
this._years = _years;
|
|
82
82
|
this._months = _months;
|