-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtimestamp.ts
More file actions
93 lines (73 loc) · 2.28 KB
/
timestamp.ts
File metadata and controls
93 lines (73 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import type { DataType } from '@apache-arrow/esnext-esm';
import { Timestamp as ArrowTimestamp, TimeUnit } from '@apache-arrow/esnext-esm';
import { DateTime } from 'luxon';
import { FormatError } from '../errors/errors.js';
import type { Nullable } from '../schema/types.js';
import type { Scalar } from './scalar.js';
import { isInvalid, NULL_VALUE } from './util.js';
export class Timestamp implements Scalar<Nullable<globalThis.Date>> {
private _valid = false;
private _value: Nullable<globalThis.Date> = null;
private _unit: TimeUnit = TimeUnit.NANOSECOND;
public constructor(unit?: TimeUnit, v?: unknown) {
this.value = v;
if (unit) {
this._unit = unit;
}
return this;
}
public get dataType(): DataType {
return new ArrowTimestamp(this._unit);
}
public get valid(): boolean {
return this._valid;
}
public get value(): Nullable<globalThis.Date> {
if (!this._valid) {
return null;
}
return this._value;
}
public set value(value: unknown) {
if (isInvalid(value)) {
this._valid = false;
return;
}
if (value instanceof Timestamp) {
this._valid = value.valid;
this._value = value.value;
return;
}
let dateValue: DateTime | null = null;
if (typeof value === 'string') {
dateValue = DateTime.fromFormat(value, 'yyyy-MM-dd HH:mm:ss.SSSSSSSSS ZZZZ', { setZone: true });
if (!dateValue.isValid) {
dateValue = DateTime.fromFormat(value, 'yyyy-MM-dd HH:mm:ss.SSSSSSSSS', { zone: 'utc' });
}
if (!dateValue.isValid) {
dateValue = DateTime.fromFormat(value, "yyyy-MM-dd HH:mm:ss.SSSSSSSSS'Z'", { zone: 'utc' });
}
if (!dateValue.isValid) {
dateValue = DateTime.fromISO(value, { setZone: true });
}
}
if (value instanceof DateTime) {
dateValue = value;
}
if (value instanceof globalThis.Date) {
dateValue = DateTime.fromJSDate(value, { zone: 'utc' });
}
if (dateValue && dateValue.isValid) {
this._value = dateValue.toJSDate();
this._valid = true;
return;
}
throw new FormatError(`Unable to set Timestamp from value`, { props: { value } });
}
public toString(): string {
if (this._valid) {
return this._value!.toISOString();
}
return NULL_VALUE;
}
}