Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/util/vs/base/common/date.ts
13405 views
1
//!!! DO NOT modify, this file was COPIED from 'microsoft/vscode'
2
3
/*---------------------------------------------------------------------------------------------
4
* Copyright (c) Microsoft Corporation. All rights reserved.
5
* Licensed under the MIT License. See License.txt in the project root for license information.
6
*--------------------------------------------------------------------------------------------*/
7
8
import { localize } from '../../nls';
9
import { Lazy } from './lazy';
10
import { LANGUAGE_DEFAULT } from './platform';
11
12
const minute = 60;
13
const hour = minute * 60;
14
const day = hour * 24;
15
const week = day * 7;
16
const month = day * 30;
17
const year = day * 365;
18
19
/**
20
* Create a localized difference of the time between now and the specified date.
21
* @param date The date to generate the difference from.
22
* @param appendAgoLabel Whether to append the " ago" to the end.
23
* @param useFullTimeWords Whether to use full words (eg. seconds) instead of
24
* shortened (eg. secs).
25
* @param disallowNow Whether to disallow the string "now" when the difference
26
* is less than 30 seconds.
27
*/
28
export function fromNow(date: number | Date, appendAgoLabel?: boolean, useFullTimeWords?: boolean, disallowNow?: boolean): string {
29
if (typeof date === 'undefined') {
30
return localize('date.fromNow.unknown', 'unknown');
31
}
32
33
if (typeof date !== 'number') {
34
date = date.getTime();
35
}
36
37
const seconds = Math.round((new Date().getTime() - date) / 1000);
38
if (seconds < -30) {
39
return localize('date.fromNow.in', 'in {0}', fromNow(new Date().getTime() + seconds * 1000, false));
40
}
41
42
if (!disallowNow && seconds < 30) {
43
return localize('date.fromNow.now', 'now');
44
}
45
46
let value: number;
47
if (seconds < minute) {
48
value = seconds;
49
50
if (appendAgoLabel) {
51
if (value === 1) {
52
return useFullTimeWords
53
? localize('date.fromNow.seconds.singular.ago.fullWord', '{0} second ago', value)
54
: localize('date.fromNow.seconds.singular.ago', '{0} sec ago', value);
55
} else {
56
return useFullTimeWords
57
? localize('date.fromNow.seconds.plural.ago.fullWord', '{0} seconds ago', value)
58
: localize('date.fromNow.seconds.plural.ago', '{0} secs ago', value);
59
}
60
} else {
61
if (value === 1) {
62
return useFullTimeWords
63
? localize('date.fromNow.seconds.singular.fullWord', '{0} second', value)
64
: localize('date.fromNow.seconds.singular', '{0} sec', value);
65
} else {
66
return useFullTimeWords
67
? localize('date.fromNow.seconds.plural.fullWord', '{0} seconds', value)
68
: localize('date.fromNow.seconds.plural', '{0} secs', value);
69
}
70
}
71
}
72
73
if (seconds < hour) {
74
value = Math.round(seconds / minute);
75
if (appendAgoLabel) {
76
if (value === 1) {
77
return useFullTimeWords
78
? localize('date.fromNow.minutes.singular.ago.fullWord', '{0} minute ago', value)
79
: localize('date.fromNow.minutes.singular.ago', '{0} min ago', value);
80
} else {
81
return useFullTimeWords
82
? localize('date.fromNow.minutes.plural.ago.fullWord', '{0} minutes ago', value)
83
: localize('date.fromNow.minutes.plural.ago', '{0} mins ago', value);
84
}
85
} else {
86
if (value === 1) {
87
return useFullTimeWords
88
? localize('date.fromNow.minutes.singular.fullWord', '{0} minute', value)
89
: localize('date.fromNow.minutes.singular', '{0} min', value);
90
} else {
91
return useFullTimeWords
92
? localize('date.fromNow.minutes.plural.fullWord', '{0} minutes', value)
93
: localize('date.fromNow.minutes.plural', '{0} mins', value);
94
}
95
}
96
}
97
98
if (seconds < day) {
99
value = Math.round(seconds / hour);
100
if (appendAgoLabel) {
101
if (value === 1) {
102
return useFullTimeWords
103
? localize('date.fromNow.hours.singular.ago.fullWord', '{0} hour ago', value)
104
: localize('date.fromNow.hours.singular.ago', '{0} hr ago', value);
105
} else {
106
return useFullTimeWords
107
? localize('date.fromNow.hours.plural.ago.fullWord', '{0} hours ago', value)
108
: localize('date.fromNow.hours.plural.ago', '{0} hrs ago', value);
109
}
110
} else {
111
if (value === 1) {
112
return useFullTimeWords
113
? localize('date.fromNow.hours.singular.fullWord', '{0} hour', value)
114
: localize('date.fromNow.hours.singular', '{0} hr', value);
115
} else {
116
return useFullTimeWords
117
? localize('date.fromNow.hours.plural.fullWord', '{0} hours', value)
118
: localize('date.fromNow.hours.plural', '{0} hrs', value);
119
}
120
}
121
}
122
123
if (seconds < week) {
124
value = Math.round(seconds / day);
125
if (appendAgoLabel) {
126
return value === 1
127
? localize('date.fromNow.days.singular.ago', '{0} day ago', value)
128
: localize('date.fromNow.days.plural.ago', '{0} days ago', value);
129
} else {
130
return value === 1
131
? localize('date.fromNow.days.singular', '{0} day', value)
132
: localize('date.fromNow.days.plural', '{0} days', value);
133
}
134
}
135
136
if (seconds < month) {
137
value = Math.round(seconds / week);
138
if (appendAgoLabel) {
139
if (value === 1) {
140
return useFullTimeWords
141
? localize('date.fromNow.weeks.singular.ago.fullWord', '{0} week ago', value)
142
: localize('date.fromNow.weeks.singular.ago', '{0} wk ago', value);
143
} else {
144
return useFullTimeWords
145
? localize('date.fromNow.weeks.plural.ago.fullWord', '{0} weeks ago', value)
146
: localize('date.fromNow.weeks.plural.ago', '{0} wks ago', value);
147
}
148
} else {
149
if (value === 1) {
150
return useFullTimeWords
151
? localize('date.fromNow.weeks.singular.fullWord', '{0} week', value)
152
: localize('date.fromNow.weeks.singular', '{0} wk', value);
153
} else {
154
return useFullTimeWords
155
? localize('date.fromNow.weeks.plural.fullWord', '{0} weeks', value)
156
: localize('date.fromNow.weeks.plural', '{0} wks', value);
157
}
158
}
159
}
160
161
if (seconds < year) {
162
value = Math.round(seconds / month);
163
if (appendAgoLabel) {
164
if (value === 1) {
165
return useFullTimeWords
166
? localize('date.fromNow.months.singular.ago.fullWord', '{0} month ago', value)
167
: localize('date.fromNow.months.singular.ago', '{0} mo ago', value);
168
} else {
169
return useFullTimeWords
170
? localize('date.fromNow.months.plural.ago.fullWord', '{0} months ago', value)
171
: localize('date.fromNow.months.plural.ago', '{0} mos ago', value);
172
}
173
} else {
174
if (value === 1) {
175
return useFullTimeWords
176
? localize('date.fromNow.months.singular.fullWord', '{0} month', value)
177
: localize('date.fromNow.months.singular', '{0} mo', value);
178
} else {
179
return useFullTimeWords
180
? localize('date.fromNow.months.plural.fullWord', '{0} months', value)
181
: localize('date.fromNow.months.plural', '{0} mos', value);
182
}
183
}
184
}
185
186
value = Math.round(seconds / year);
187
if (appendAgoLabel) {
188
if (value === 1) {
189
return useFullTimeWords
190
? localize('date.fromNow.years.singular.ago.fullWord', '{0} year ago', value)
191
: localize('date.fromNow.years.singular.ago', '{0} yr ago', value);
192
} else {
193
return useFullTimeWords
194
? localize('date.fromNow.years.plural.ago.fullWord', '{0} years ago', value)
195
: localize('date.fromNow.years.plural.ago', '{0} yrs ago', value);
196
}
197
} else {
198
if (value === 1) {
199
return useFullTimeWords
200
? localize('date.fromNow.years.singular.fullWord', '{0} year', value)
201
: localize('date.fromNow.years.singular', '{0} yr', value);
202
} else {
203
return useFullTimeWords
204
? localize('date.fromNow.years.plural.fullWord', '{0} years', value)
205
: localize('date.fromNow.years.plural', '{0} yrs', value);
206
}
207
}
208
}
209
210
export function fromNowByDay(date: number | Date, appendAgoLabel?: boolean, useFullTimeWords?: boolean): string {
211
if (typeof date !== 'number') {
212
date = date.getTime();
213
}
214
215
const todayMidnightTime = new Date();
216
todayMidnightTime.setHours(0, 0, 0, 0);
217
const yesterdayMidnightTime = new Date(todayMidnightTime.getTime());
218
yesterdayMidnightTime.setDate(yesterdayMidnightTime.getDate() - 1);
219
220
if (date > todayMidnightTime.getTime()) {
221
return localize('today', 'Today');
222
}
223
224
if (date > yesterdayMidnightTime.getTime()) {
225
return localize('yesterday', 'Yesterday');
226
}
227
228
return fromNow(date, appendAgoLabel, useFullTimeWords);
229
}
230
231
/**
232
* Gets a readable duration with intelligent/lossy precision. For example "40ms" or "3.040s")
233
* @param ms The duration to get in milliseconds.
234
* @param useFullTimeWords Whether to use full words (eg. seconds) instead of
235
* shortened (eg. secs).
236
*/
237
export function getDurationString(ms: number, useFullTimeWords?: boolean) {
238
const seconds = Math.abs(ms / 1000);
239
if (seconds < 1) {
240
return useFullTimeWords
241
? localize('duration.ms.full', '{0} milliseconds', ms)
242
: localize('duration.ms', '{0}ms', ms);
243
}
244
if (seconds < minute) {
245
return useFullTimeWords
246
? localize('duration.s.full', '{0} seconds', Math.round(ms) / 1000)
247
: localize('duration.s', '{0}s', Math.round(ms) / 1000);
248
}
249
if (seconds < hour) {
250
return useFullTimeWords
251
? localize('duration.m.full', '{0} minutes', Math.round(ms / (1000 * minute)))
252
: localize('duration.m', '{0} mins', Math.round(ms / (1000 * minute)));
253
}
254
if (seconds < day) {
255
return useFullTimeWords
256
? localize('duration.h.full', '{0} hours', Math.round(ms / (1000 * hour)))
257
: localize('duration.h', '{0} hrs', Math.round(ms / (1000 * hour)));
258
}
259
return localize('duration.d', '{0} days', Math.round(ms / (1000 * day)));
260
}
261
262
export function toLocalISOString(date: Date): string {
263
return date.getFullYear() +
264
'-' + String(date.getMonth() + 1).padStart(2, '0') +
265
'-' + String(date.getDate()).padStart(2, '0') +
266
'T' + String(date.getHours()).padStart(2, '0') +
267
':' + String(date.getMinutes()).padStart(2, '0') +
268
':' + String(date.getSeconds()).padStart(2, '0') +
269
'.' + (date.getMilliseconds() / 1000).toFixed(3).slice(2, 5) +
270
'Z';
271
}
272
273
export const safeIntl = {
274
DateTimeFormat(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): Lazy<Intl.DateTimeFormat> {
275
return new Lazy(() => {
276
try {
277
return new Intl.DateTimeFormat(locales, options);
278
} catch {
279
return new Intl.DateTimeFormat(undefined, options);
280
}
281
});
282
},
283
Collator(locales?: Intl.LocalesArgument, options?: Intl.CollatorOptions): Lazy<Intl.Collator> {
284
return new Lazy(() => {
285
try {
286
return new Intl.Collator(locales, options);
287
} catch {
288
return new Intl.Collator(undefined, options);
289
}
290
});
291
},
292
Segmenter(locales?: Intl.LocalesArgument, options?: Intl.SegmenterOptions): Lazy<Intl.Segmenter> {
293
return new Lazy(() => {
294
try {
295
return new Intl.Segmenter(locales, options);
296
} catch {
297
return new Intl.Segmenter(undefined, options);
298
}
299
});
300
},
301
Locale(tag: Intl.Locale | string, options?: Intl.LocaleOptions): Lazy<Intl.Locale> {
302
return new Lazy(() => {
303
try {
304
return new Intl.Locale(tag, options);
305
} catch {
306
return new Intl.Locale(LANGUAGE_DEFAULT, options);
307
}
308
});
309
},
310
NumberFormat(locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): Lazy<Intl.NumberFormat> {
311
return new Lazy(() => {
312
try {
313
return new Intl.NumberFormat(locales, options);
314
} catch {
315
return new Intl.NumberFormat(undefined, options);
316
}
317
});
318
}
319
};
320
321