-
Notifications
You must be signed in to change notification settings - Fork 448
/
date-time.ts
243 lines (174 loc) · 5.73 KB
/
date-time.ts
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import * as moment from 'moment';
export class DateTime {
public get raw(): Date {
return this.value;
}
public get weekDay(): number {
return this.value.getDay();
}
public get year(): number {
return this.value.getFullYear();
}
public get timestamp(): number {
return this.value.getTime();
}
public get month(): number {
return this.value.getMonth() + 1;
}
public get day(): number {
return this.value.getDate();
}
public get hours(): number {
return this.value.getHours();
}
public get minutes(): number {
return this.value.getMinutes();
}
public get seconds(): number {
return this.value.getSeconds();
}
public get milliseconds(): number {
return this.value.getMilliseconds();
}
public get date(): DateTime {
const clone = this.cloneDate();
clone.setHours(0, 0, 0, 0);
return new DateTime(clone);
}
constructor(private readonly value: Date) {
Object.freeze(this);
}
public static iso8601(): any {
return moment.ISO_8601;
}
public static now(): DateTime {
return new DateTime(new Date());
}
public static today(): DateTime {
return DateTime.now().date;
}
public static tomorrow(): DateTime {
return DateTime.now().addDays(1).date;
}
public static yesterday(): DateTime {
return DateTime.now().addDays(-1).date;
}
public static parseMSDate(value: string): DateTime {
let off = parseInt(value.substr(19, 3), 10);
if (isNaN(off)) {
off = 0;
}
const date = new Date(parseInt(value.substr(6), 10));
const time = (date.getTime());
const offs = (date.getTimezoneOffset() + off * 60) * 60000;
date.setTime(time + offs);
return new DateTime(date);
}
public static parseISO(value: string): DateTime {
return DateTime.parse(value, DateTime.iso8601());
}
public static parseISO_UTC(value: string): DateTime {
return DateTime.parseUTC(value, DateTime.iso8601());
}
public static parse(value: string, format: string): DateTime {
const parsedMoment = moment(value, format);
if (parsedMoment.isValid()) {
return new DateTime(parsedMoment.toDate());
} else {
throw `${value} is not a valid date time string`;
}
}
public static parseUTC(value: string, format: string): DateTime {
const parsedMoment = moment.utc(value, format);
if (parsedMoment.isValid()) {
return new DateTime(new Date(parsedMoment.valueOf() - parsedMoment.local().utcOffset() * 60 * 1000));
} else {
throw `${value} is not a valid date time string`;
}
}
private cloneDate(): Date {
return new Date(this.value.getTime());
}
public eq(v: DateTime): boolean {
return v && (this === v || this.timestamp === v.timestamp);
}
public ne(v: DateTime): boolean {
return !v || this.timestamp !== v.timestamp;
}
public lt(v: DateTime): boolean {
return v && this.timestamp < v.timestamp;
}
public le(v: DateTime): boolean {
return v && this.timestamp <= v.timestamp;
}
public gt(v: DateTime): boolean {
return v && this.timestamp > v.timestamp;
}
public ge(v: DateTime): boolean {
return v && this.timestamp >= v.timestamp;
}
public firstOfWeek(): DateTime {
const weekStart = new Date(this.value.valueOf() - (this.weekDay - 1) * 86400000);
return new DateTime(weekStart);
}
public firstOfMonth(): DateTime {
const monthStart = new Date(this.year, this.month - 1, 1);
return new DateTime(monthStart);
}
public addYears(value: number): DateTime {
const clone = this.cloneDate();
clone.setFullYear(clone.getFullYear() + value, clone.getMonth(), clone.getDay());
return new DateTime(clone);
}
public addMonths(value: number): DateTime {
const clone = this.cloneDate();
clone.setMonth(clone.getMonth() + value, clone.getDate());
return new DateTime(clone);
}
public addDays(value: number): DateTime {
const clone = this.cloneDate();
clone.setDate(clone.getDate() + value);
return new DateTime(clone);
}
public addHours(value: number): DateTime {
const clone = this.cloneDate();
clone.setTime(clone.getTime() + (value * 60 * 60 * 1000));
return new DateTime(clone);
}
public addMinutes(value: number): DateTime {
const clone = this.cloneDate();
clone.setTime(clone.getTime() + (value * 60 * 1000));
return new DateTime(clone);
}
public addSeconds(value: number): DateTime {
const clone = this.cloneDate();
clone.setTime(clone.getTime() + (value * 1000));
return new DateTime(clone);
}
public addMilliseconds(value: number): DateTime {
const clone = this.cloneDate();
clone.setTime(clone.getTime() + value);
return new DateTime(clone);
}
public toLocal(): DateTime {
return new DateTime(new Date(this.value.getTime() - this.value.getTimezoneOffset() * 60 * 1000));
}
public toUTCString(): string {
return this.value.toUTCString();
}
public toString(): string {
return moment(this.value).format();
}
public toStringFormat(format: string): string {
return moment(this.value).format(format);
}
public toFromNow(): string {
return moment(this.value).fromNow();
}
}