1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | import {assert, requireNonNull} from '../assert';
|
7 | import {UnsupportedTemporalTypeException} from '../errors';
|
8 |
|
9 | import {Instant} from '../Instant';
|
10 | import {LocalDate} from '../LocalDate';
|
11 | import {LocalTime} from '../LocalTime';
|
12 | import {MathUtil} from '../MathUtil';
|
13 | import {ZoneId} from '../ZoneId';
|
14 |
|
15 | import {ChronoField} from './ChronoField';
|
16 | import {TemporalQueries} from './TemporalQueries';
|
17 | import {TemporalAccessor} from './TemporalAccessor';
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | class NativeJsTemporal extends TemporalAccessor {
|
24 |
|
25 | |
26 |
|
27 |
|
28 |
|
29 |
|
30 | constructor(date, zone=ZoneId.systemDefault()){
|
31 | super();
|
32 | this._zone = zone;
|
33 | if(date instanceof Date) {
|
34 | this._epochMilli = date.getTime();
|
35 | return;
|
36 | } else if(typeof date.toDate === 'function' && date.toDate() instanceof Date) {
|
37 |
|
38 | this._epochMilli = date.toDate().getTime();
|
39 | return;
|
40 | }
|
41 | assert(false, 'date must be either a javascript date or a moment');
|
42 | }
|
43 |
|
44 | |
45 |
|
46 |
|
47 |
|
48 |
|
49 | query(query) {
|
50 | requireNonNull(query, 'query');
|
51 | if (query === TemporalQueries.localDate()) {
|
52 | return LocalDate.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
|
53 | } else if(query === TemporalQueries.localTime()){
|
54 | return LocalTime.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
|
55 | } else if(query === TemporalQueries.zone()){
|
56 | return this._zone;
|
57 | }
|
58 | return super.query(query);
|
59 | }
|
60 |
|
61 | |
62 |
|
63 |
|
64 |
|
65 |
|
66 | get(field) {
|
67 | return this.getLong(field);
|
68 | }
|
69 |
|
70 | |
71 |
|
72 |
|
73 |
|
74 |
|
75 | getLong(field) {
|
76 | requireNonNull(field, 'field');
|
77 | if (field instanceof ChronoField) {
|
78 | switch (field) {
|
79 | case ChronoField.NANO_OF_SECOND: return MathUtil.floorMod(this._epochMilli, 1000) * 1000000;
|
80 | case ChronoField.INSTANT_SECONDS: return MathUtil.floorDiv(this._epochMilli, 1000);
|
81 | }
|
82 | throw new UnsupportedTemporalTypeException('Unsupported field: ' + field);
|
83 | }
|
84 | return field.getFrom(this);
|
85 | }
|
86 |
|
87 | |
88 |
|
89 |
|
90 |
|
91 |
|
92 | isSupported(field){
|
93 | return field === ChronoField.INSTANT_SECONDS || field === ChronoField.NANO_OF_SECOND;
|
94 | }
|
95 | }
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 | export function nativeJs(date, zone){
|
104 | return new NativeJsTemporal(date, zone);
|
105 | }
|