UNPKG

3.43 kBJavaScriptView Raw
1/*
2 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
3 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
4 */
5
6import {assert, requireNonNull} from '../assert';
7import {UnsupportedTemporalTypeException} from '../errors';
8
9import {Instant} from '../Instant';
10import {LocalDate} from '../LocalDate';
11import {LocalTime} from '../LocalTime';
12import {MathUtil} from '../MathUtil';
13import {ZoneId} from '../ZoneId';
14
15import {ChronoField} from './ChronoField';
16import {TemporalQueries} from './TemporalQueries';
17import {TemporalAccessor} from './TemporalAccessor';
18
19/**
20 * A wrapper around a native javascript Date instance that
21 * implements TemporalAccessor functionality
22 */
23class NativeJsTemporal extends TemporalAccessor {
24
25 /**
26 * @param {!(Date|moment)} date - a javascript Date or a moment instance
27 * @param {ZoneId} [zone=ZoneId.systemDefault()] - the zone of the temporal, defaults to ZoneId.systemDefault()
28 * @private
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 // it's a moment
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 * @param {TemporalQuery} query the query to invoke, not null
46 * @return {*} the query result, null may be returned (defined by the query)
47 * @throws DateTimeException if unable to query
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 * @param {TemporalField} field
64 * @returns {number}
65 */
66 get(field) {
67 return this.getLong(field);
68 }
69
70 /**
71 *
72 * @param {!TemporalField} field
73 * @returns {number}
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 * @param {TemporalField} field
90 * @returns {boolean}
91 */
92 isSupported(field){
93 return field === ChronoField.INSTANT_SECONDS || field === ChronoField.NANO_OF_SECOND;
94 }
95}
96
97/**
98 *
99 * @param {!(Date|moment)} date - a javascript Date or a moment instance
100 * @param {ZoneId} [zone=ZoneId.systemDefault()] - the zone of the temporal, defaults to ZoneId.systemDefault()
101 * @returns {NativeJsTemporal}
102 */
103export function nativeJs(date, zone){
104 return new NativeJsTemporal(date, zone);
105}