@gobrand/tiempo 2.1.0 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +131 -8
- package/dist/{chunk-5FRUAUH2.js → chunk-2G5RJGPR.js} +9 -5
- package/dist/chunk-2G5RJGPR.js.map +1 -0
- package/dist/chunk-2WMXB7QL.js +17 -0
- package/dist/chunk-2WMXB7QL.js.map +1 -0
- package/dist/chunk-AVGNRINZ.js +9 -0
- package/dist/chunk-AVGNRINZ.js.map +1 -0
- package/dist/chunk-BBNNR2QH.js +16 -0
- package/dist/chunk-BBNNR2QH.js.map +1 -0
- package/dist/chunk-CUMB4776.js +18 -0
- package/dist/chunk-CUMB4776.js.map +1 -0
- package/dist/chunk-GM6RNAYE.js +19 -0
- package/dist/chunk-GM6RNAYE.js.map +1 -0
- package/dist/chunk-IPJUERCK.js +16 -0
- package/dist/chunk-IPJUERCK.js.map +1 -0
- package/dist/chunk-MJSZNWCV.js +10 -0
- package/dist/chunk-MJSZNWCV.js.map +1 -0
- package/dist/chunk-RW3C2677.js +16 -0
- package/dist/chunk-RW3C2677.js.map +1 -0
- package/dist/chunk-TU2UNOOW.js +15 -0
- package/dist/chunk-TU2UNOOW.js.map +1 -0
- package/dist/chunk-TW5EV3DH.js +14 -0
- package/dist/chunk-TW5EV3DH.js.map +1 -0
- package/dist/chunk-XDVUGTUV.js +20 -0
- package/dist/chunk-XDVUGTUV.js.map +1 -0
- package/dist/chunk-XVJJR7H6.js +20 -0
- package/dist/chunk-XVJJR7H6.js.map +1 -0
- package/dist/chunk-YR2UCUIT.js +15 -0
- package/dist/chunk-YR2UCUIT.js.map +1 -0
- package/dist/endOfDay.d.ts +34 -0
- package/dist/endOfDay.d.ts.map +1 -0
- package/dist/endOfDay.js +9 -0
- package/dist/endOfDay.js.map +1 -0
- package/dist/endOfDay.test.d.ts +2 -0
- package/dist/endOfDay.test.d.ts.map +1 -0
- package/dist/endOfMonth.d.ts +34 -0
- package/dist/endOfMonth.d.ts.map +1 -0
- package/dist/endOfMonth.js +9 -0
- package/dist/endOfMonth.js.map +1 -0
- package/dist/endOfMonth.test.d.ts +2 -0
- package/dist/endOfMonth.test.d.ts.map +1 -0
- package/dist/endOfWeek.d.ts +35 -0
- package/dist/endOfWeek.d.ts.map +1 -0
- package/dist/endOfWeek.js +9 -0
- package/dist/endOfWeek.js.map +1 -0
- package/dist/endOfWeek.test.d.ts +2 -0
- package/dist/endOfWeek.test.d.ts.map +1 -0
- package/dist/endOfYear.d.ts +34 -0
- package/dist/endOfYear.d.ts.map +1 -0
- package/dist/endOfYear.js +9 -0
- package/dist/endOfYear.js.map +1 -0
- package/dist/endOfYear.test.d.ts +2 -0
- package/dist/endOfYear.test.d.ts.map +1 -0
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +2 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -4
- package/dist/isAfter.d.ts +40 -0
- package/dist/isAfter.d.ts.map +1 -0
- package/dist/isAfter.js +8 -0
- package/dist/isAfter.js.map +1 -0
- package/dist/isAfter.test.d.ts +2 -0
- package/dist/isAfter.test.d.ts.map +1 -0
- package/dist/isBefore.d.ts +40 -0
- package/dist/isBefore.d.ts.map +1 -0
- package/dist/isBefore.js +8 -0
- package/dist/isBefore.js.map +1 -0
- package/dist/isBefore.test.d.ts +2 -0
- package/dist/isBefore.test.d.ts.map +1 -0
- package/dist/isSameDay.d.ts +58 -0
- package/dist/isSameDay.d.ts.map +1 -0
- package/dist/isSameDay.js +8 -0
- package/dist/isSameDay.js.map +1 -0
- package/dist/isSameDay.test.d.ts +2 -0
- package/dist/isSameDay.test.d.ts.map +1 -0
- package/dist/shared/endOfDay.d.ts +7 -0
- package/dist/shared/endOfDay.d.ts.map +1 -0
- package/dist/shared/endOfDay.js +7 -0
- package/dist/shared/endOfDay.js.map +1 -0
- package/dist/shared/normalizeTemporalInput.d.ts +8 -0
- package/dist/shared/normalizeTemporalInput.d.ts.map +1 -0
- package/dist/shared/normalizeTemporalInput.js +7 -0
- package/dist/shared/normalizeTemporalInput.js.map +1 -0
- package/dist/startOfDay.d.ts +34 -0
- package/dist/startOfDay.d.ts.map +1 -0
- package/dist/startOfDay.js +8 -0
- package/dist/startOfDay.js.map +1 -0
- package/dist/startOfDay.test.d.ts +2 -0
- package/dist/startOfDay.test.d.ts.map +1 -0
- package/dist/startOfMonth.d.ts +34 -0
- package/dist/startOfMonth.d.ts.map +1 -0
- package/dist/startOfMonth.js +8 -0
- package/dist/startOfMonth.js.map +1 -0
- package/dist/startOfMonth.test.d.ts +2 -0
- package/dist/startOfMonth.test.d.ts.map +1 -0
- package/dist/startOfWeek.d.ts +35 -0
- package/dist/startOfWeek.d.ts.map +1 -0
- package/dist/startOfWeek.js +8 -0
- package/dist/startOfWeek.js.map +1 -0
- package/dist/startOfWeek.test.d.ts +2 -0
- package/dist/startOfWeek.test.d.ts.map +1 -0
- package/dist/startOfYear.d.ts +34 -0
- package/dist/startOfYear.d.ts.map +1 -0
- package/dist/startOfYear.js +8 -0
- package/dist/startOfYear.js.map +1 -0
- package/dist/startOfYear.test.d.ts +2 -0
- package/dist/startOfYear.test.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-5FRUAUH2.js.map +0 -1
package/README.md
CHANGED
|
@@ -42,7 +42,9 @@ console.log(utc); // "2025-01-20T20:00:00Z"
|
|
|
42
42
|
|
|
43
43
|
## API
|
|
44
44
|
|
|
45
|
-
###
|
|
45
|
+
### Core Conversions
|
|
46
|
+
|
|
47
|
+
#### `toZonedTime(input, timezone)`
|
|
46
48
|
|
|
47
49
|
Convert a UTC ISO string, Instant, or ZonedDateTime to a ZonedDateTime in the specified timezone.
|
|
48
50
|
|
|
@@ -70,7 +72,7 @@ const nyTime = Temporal.ZonedDateTime.from("2025-01-20T15:00:00-05:00[America/Ne
|
|
|
70
72
|
const tokyoTime = toZonedTime(nyTime, "Asia/Tokyo");
|
|
71
73
|
```
|
|
72
74
|
|
|
73
|
-
|
|
75
|
+
#### `toUtc(input)`
|
|
74
76
|
|
|
75
77
|
Convert a UTC ISO string or ZonedDateTime to a Temporal.Instant (UTC).
|
|
76
78
|
|
|
@@ -92,7 +94,7 @@ const instant2 = toUtc(zoned);
|
|
|
92
94
|
// Both represent the same UTC moment: 2025-01-20T20:00:00Z
|
|
93
95
|
```
|
|
94
96
|
|
|
95
|
-
|
|
97
|
+
#### `toUtcString(input)`
|
|
96
98
|
|
|
97
99
|
Convert a Temporal.Instant or ZonedDateTime to a UTC ISO 8601 string.
|
|
98
100
|
|
|
@@ -116,7 +118,9 @@ const iso2 = toUtcString(instant);
|
|
|
116
118
|
console.log(iso2); // "2025-01-20T20:00:00Z"
|
|
117
119
|
```
|
|
118
120
|
|
|
119
|
-
###
|
|
121
|
+
### Formatting
|
|
122
|
+
|
|
123
|
+
#### `format(input, formatStr, options?)`
|
|
120
124
|
|
|
121
125
|
Format a Temporal.Instant or ZonedDateTime using date-fns-like format tokens.
|
|
122
126
|
|
|
@@ -146,9 +150,11 @@ Format a Temporal.Instant or ZonedDateTime using date-fns-like format tokens.
|
|
|
146
150
|
|
|
147
151
|
**Example:**
|
|
148
152
|
```typescript
|
|
149
|
-
import { format } from '@gobrand/tiempo';
|
|
153
|
+
import { format, toZonedTime, toUtc } from '@gobrand/tiempo';
|
|
150
154
|
|
|
151
|
-
|
|
155
|
+
// From ISO string to ZonedDateTime, then format
|
|
156
|
+
const isoString = "2025-01-20T20:30:45.000Z";
|
|
157
|
+
const zoned = toZonedTime(isoString, "America/New_York");
|
|
152
158
|
|
|
153
159
|
format(zoned, "yyyy-MM-dd"); // "2025-01-20"
|
|
154
160
|
format(zoned, "MMMM d, yyyy"); // "January 20, 2025"
|
|
@@ -159,12 +165,129 @@ format(zoned, "EEEE, MMMM do, yyyy 'at' h:mm a"); // "Monday, January 20th, 2025
|
|
|
159
165
|
format(zoned, "MMMM d, yyyy", { locale: "es-ES" }); // "enero 20, 2025"
|
|
160
166
|
format(zoned, "EEEE", { locale: "fr-FR" }); // "lundi"
|
|
161
167
|
|
|
162
|
-
//
|
|
163
|
-
const instant =
|
|
168
|
+
// From ISO string to Instant (UTC), then format with timezone conversion
|
|
169
|
+
const instant = toUtc(isoString);
|
|
164
170
|
format(instant, "yyyy-MM-dd HH:mm", { timeZone: "America/New_York" }); // "2025-01-20 15:30"
|
|
165
171
|
format(instant, "yyyy-MM-dd HH:mm", { timeZone: "Asia/Tokyo" }); // "2025-01-21 05:30"
|
|
166
172
|
```
|
|
167
173
|
|
|
174
|
+
### Start/End Utilities
|
|
175
|
+
|
|
176
|
+
#### `startOfDay(input)` / `endOfDay(input)`
|
|
177
|
+
|
|
178
|
+
Get the start or end of the day for a given datetime.
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
import { startOfDay, endOfDay } from '@gobrand/tiempo';
|
|
182
|
+
|
|
183
|
+
const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');
|
|
184
|
+
|
|
185
|
+
startOfDay(zoned); // 2025-01-20T00:00:00-05:00[America/New_York]
|
|
186
|
+
endOfDay(zoned); // 2025-01-20T23:59:59.999999999-05:00[America/New_York]
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
#### `startOfWeek(input, options?)` / `endOfWeek(input, options?)`
|
|
190
|
+
|
|
191
|
+
Get the start or end of the week. Customize the week start day (defaults to Sunday).
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
import { startOfWeek, endOfWeek } from '@gobrand/tiempo';
|
|
195
|
+
|
|
196
|
+
const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');
|
|
197
|
+
|
|
198
|
+
// Default: Sunday start
|
|
199
|
+
startOfWeek(zoned); // 2025-01-19T00:00:00-05:00[America/New_York]
|
|
200
|
+
endOfWeek(zoned); // 2025-01-25T23:59:59.999999999-05:00[America/New_York]
|
|
201
|
+
|
|
202
|
+
// Custom: Monday start
|
|
203
|
+
startOfWeek(zoned, { weekStartsOn: 1 }); // 2025-01-20T00:00:00-05:00[America/New_York]
|
|
204
|
+
endOfWeek(zoned, { weekStartsOn: 1 }); // 2025-01-26T23:59:59.999999999-05:00[America/New_York]
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
#### `startOfMonth(input)` / `endOfMonth(input)`
|
|
208
|
+
|
|
209
|
+
Get the start or end of the month.
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
import { startOfMonth, endOfMonth } from '@gobrand/tiempo';
|
|
213
|
+
|
|
214
|
+
const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');
|
|
215
|
+
|
|
216
|
+
startOfMonth(zoned); // 2025-01-01T00:00:00-05:00[America/New_York]
|
|
217
|
+
endOfMonth(zoned); // 2025-01-31T23:59:59.999999999-05:00[America/New_York]
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
#### `startOfYear(input)` / `endOfYear(input)`
|
|
221
|
+
|
|
222
|
+
Get the start or end of the year.
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
import { startOfYear, endOfYear } from '@gobrand/tiempo';
|
|
226
|
+
|
|
227
|
+
const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');
|
|
228
|
+
|
|
229
|
+
startOfYear(zoned); // 2025-01-01T00:00:00-05:00[America/New_York]
|
|
230
|
+
endOfYear(zoned); // 2025-12-31T23:59:59.999999999-05:00[America/New_York]
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Comparison Utilities
|
|
234
|
+
|
|
235
|
+
#### `isBefore(date1, date2)`
|
|
236
|
+
|
|
237
|
+
Check if the first datetime is before the second. Compares the underlying instant in time.
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
import { isBefore } from '@gobrand/tiempo';
|
|
241
|
+
|
|
242
|
+
const earlier = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');
|
|
243
|
+
const later = Temporal.ZonedDateTime.from('2025-01-20T15:00:00-05:00[America/New_York]');
|
|
244
|
+
|
|
245
|
+
isBefore(earlier, later); // true
|
|
246
|
+
isBefore(later, earlier); // false
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
#### `isAfter(date1, date2)`
|
|
250
|
+
|
|
251
|
+
Check if the first datetime is after the second. Compares the underlying instant in time.
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
import { isAfter } from '@gobrand/tiempo';
|
|
255
|
+
|
|
256
|
+
const earlier = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');
|
|
257
|
+
const later = Temporal.ZonedDateTime.from('2025-01-20T15:00:00-05:00[America/New_York]');
|
|
258
|
+
|
|
259
|
+
isAfter(later, earlier); // true
|
|
260
|
+
isAfter(earlier, later); // false
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
#### `isSameDay(date1, date2)`
|
|
264
|
+
|
|
265
|
+
Check if two datetimes fall on the same calendar day. Compares year, month, and day fields directly.
|
|
266
|
+
|
|
267
|
+
**Important:** For ZonedDateTime inputs with different timezones, each date is compared in its own timezone. Convert to a common timezone first if you need a specific perspective.
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
import { isSameDay } from '@gobrand/tiempo';
|
|
271
|
+
|
|
272
|
+
// Same timezone, same day
|
|
273
|
+
const morning = Temporal.ZonedDateTime.from('2025-01-20T08:00:00Z[UTC]');
|
|
274
|
+
const evening = Temporal.ZonedDateTime.from('2025-01-20T23:00:00Z[UTC]');
|
|
275
|
+
isSameDay(morning, evening); // true
|
|
276
|
+
|
|
277
|
+
// Different timezones - compares in their respective timezones
|
|
278
|
+
const ny = Temporal.ZonedDateTime.from('2025-01-20T23:00:00-05:00[America/New_York]');
|
|
279
|
+
const tokyo = Temporal.ZonedDateTime.from('2025-01-21T13:00:00+09:00[Asia/Tokyo]');
|
|
280
|
+
isSameDay(ny, tokyo); // false (Jan 20 in NY, Jan 21 in Tokyo)
|
|
281
|
+
|
|
282
|
+
// Convert to UTC to compare in UTC timezone
|
|
283
|
+
isSameDay(ny.withTimeZone('UTC'), tokyo.withTimeZone('UTC')); // true (both Jan 21 in UTC)
|
|
284
|
+
|
|
285
|
+
// Instant inputs are automatically converted to UTC
|
|
286
|
+
const instant1 = Temporal.Instant.from('2025-01-20T10:00:00Z');
|
|
287
|
+
const instant2 = Temporal.Instant.from('2025-01-20T23:00:00Z');
|
|
288
|
+
isSameDay(instant1, instant2); // true (both Jan 20 in UTC)
|
|
289
|
+
```
|
|
290
|
+
|
|
168
291
|
## Complete Workflow Example
|
|
169
292
|
|
|
170
293
|
```typescript
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeTemporalInput
|
|
3
|
+
} from "./chunk-MJSZNWCV.js";
|
|
4
|
+
|
|
1
5
|
// src/format.ts
|
|
2
6
|
import { Temporal } from "@js-temporal/polyfill";
|
|
3
7
|
function format(input, formatStr, options = {}) {
|
|
4
8
|
const { locale = "en-US", timeZone } = options;
|
|
5
9
|
let zonedDateTime;
|
|
6
|
-
if (
|
|
7
|
-
const
|
|
8
|
-
zonedDateTime =
|
|
10
|
+
if (timeZone) {
|
|
11
|
+
const instant = input instanceof Temporal.Instant ? input : input.toInstant();
|
|
12
|
+
zonedDateTime = instant.toZonedDateTimeISO(timeZone);
|
|
9
13
|
} else {
|
|
10
|
-
zonedDateTime =
|
|
14
|
+
zonedDateTime = normalizeTemporalInput(input);
|
|
11
15
|
}
|
|
12
16
|
let result = "";
|
|
13
17
|
let i = 0;
|
|
@@ -326,4 +330,4 @@ function getTimezoneOffset(zonedDateTime) {
|
|
|
326
330
|
export {
|
|
327
331
|
format
|
|
328
332
|
};
|
|
329
|
-
//# sourceMappingURL=chunk-
|
|
333
|
+
//# sourceMappingURL=chunk-2G5RJGPR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/format.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\nexport interface FormatOptions {\n locale?: string;\n timeZone?: string;\n}\n\n/**\n * Format a Temporal.Instant or ZonedDateTime using date-fns-like format tokens.\n * Uses Intl.DateTimeFormat under the hood via Temporal's toLocaleString() for zero dependencies.\n *\n * @param input - A Temporal.Instant or Temporal.ZonedDateTime to format\n * @param formatStr - Format string using date-fns tokens (e.g., \"yyyy-MM-dd HH:mm:ss\")\n * @param options - Optional configuration for locale and timezone\n * @returns Formatted date string\n *\n * @example\n * ```typescript\n * const zoned = Temporal.ZonedDateTime.from(\"2025-01-20T15:00:00-05:00[America/New_York]\");\n *\n * format(zoned, \"yyyy-MM-dd\"); // \"2025-01-20\"\n * format(zoned, \"MMMM d, yyyy\"); // \"January 20, 2025\"\n * format(zoned, \"h:mm a\"); // \"3:00 PM\"\n * format(zoned, \"EEEE, MMMM do, yyyy 'at' h:mm a\"); // \"Monday, January 20th, 2025 at 3:00 PM\"\n *\n * // With locale\n * format(zoned, \"MMMM d, yyyy\", { locale: \"es-ES\" }); // \"enero 20, 2025\"\n * ```\n */\nexport function format(\n input: Temporal.Instant | Temporal.ZonedDateTime,\n formatStr: string,\n options: FormatOptions = {}\n): string {\n const { locale = 'en-US', timeZone } = options;\n\n // Convert to ZonedDateTime, applying custom timezone if provided\n let zonedDateTime: Temporal.ZonedDateTime;\n if (timeZone) {\n // If custom timezone specified, convert via Instant\n const instant = input instanceof Temporal.Instant ? input : input.toInstant();\n zonedDateTime = instant.toZonedDateTimeISO(timeZone);\n } else {\n // No custom timezone: normalize to ZonedDateTime (Instant -> UTC, ZonedDateTime -> keep as-is)\n zonedDateTime = normalizeTemporalInput(input);\n }\n\n let result = '';\n let i = 0;\n const len = formatStr.length;\n\n while (i < len) {\n const char = formatStr[i];\n if (!char) break;\n\n // Handle escaped text\n if (char === \"'\") {\n // Check for double single quote (not inside a string, just '')\n if (i + 1 < len && formatStr[i + 1] === \"'\") {\n result += \"'\";\n i += 2;\n continue;\n }\n // Find closing quote, handling '' inside the string\n i++;\n while (i < len) {\n if (formatStr[i] === \"'\") {\n // Check if it's a doubled quote ''\n if (i + 1 < len && formatStr[i + 1] === \"'\") {\n result += \"'\";\n i += 2;\n } else {\n // End of quoted string\n i++;\n break;\n }\n } else {\n result += formatStr[i];\n i++;\n }\n }\n continue;\n }\n\n // Check for tokens by looking ahead\n const token = consumeToken(formatStr, i, char);\n if (token !== null) {\n result += formatToken(token, zonedDateTime, locale);\n i += token.length;\n } else {\n result += char;\n i++;\n }\n }\n\n return result;\n}\n\nfunction consumeToken(formatStr: string, start: number, char: string): string | null {\n // Special case for 'Mo' and 'do' - these end with 'o'\n if (char === 'M' && start + 1 < formatStr.length && formatStr[start + 1] === 'o') {\n return 'Mo';\n }\n if (char === 'd' && start + 1 < formatStr.length && formatStr[start + 1] === 'o') {\n return 'do';\n }\n\n // Count how many consecutive identical characters\n let end = start;\n while (end < formatStr.length && formatStr[end] === char) {\n end++;\n }\n const count = end - start;\n\n // Check if this is a valid token pattern\n const validTokens = [\n 'GGGGG',\n 'GGGG',\n 'GGG',\n 'GG',\n 'G',\n 'yyyy',\n 'yyy',\n 'yy',\n 'y',\n 'QQQQQ',\n 'QQQQ',\n 'QQQ',\n 'QQ',\n 'Q',\n 'MMMMM',\n 'MMMM',\n 'MMM',\n 'MM',\n 'M',\n 'dd',\n 'd',\n 'EEEEEE',\n 'EEEEE',\n 'EEEE',\n 'EEE',\n 'EE',\n 'E',\n 'aaaaa',\n 'aaaa',\n 'aaa',\n 'aa',\n 'a',\n 'HH',\n 'H',\n 'hh',\n 'h',\n 'mm',\n 'm',\n 'ss',\n 's',\n 'SSS',\n 'SS',\n 'S',\n 'XXXXX',\n 'XXXX',\n 'XXX',\n 'XX',\n 'X',\n 'xxxxx',\n 'xxxx',\n 'xxx',\n 'xx',\n 'x',\n 'zzzz',\n 'zzz',\n 'zz',\n 'z',\n 'T',\n 't',\n ];\n\n // Try to match from longest to shortest\n for (let len = Math.min(count, 6); len > 0; len--) {\n const candidate = char.repeat(len);\n if (validTokens.includes(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction formatToken(token: string, zonedDateTime: Temporal.ZonedDateTime, locale: string): string {\n switch (token) {\n // Era\n case 'GGGGG':\n return formatPart(zonedDateTime, 'era', 'narrow', locale);\n case 'GGGG':\n return formatPart(zonedDateTime, 'era', 'long', locale);\n case 'GGG':\n case 'GG':\n case 'G':\n return formatPart(zonedDateTime, 'era', 'short', locale);\n\n // Year\n case 'yyyy':\n return zonedDateTime.year.toString().padStart(4, '0');\n case 'yyy':\n return zonedDateTime.year.toString().padStart(3, '0');\n case 'yy':\n return (zonedDateTime.year % 100).toString().padStart(2, '0');\n case 'y':\n return zonedDateTime.year.toString();\n\n // Quarter\n case 'QQQQQ':\n return Math.ceil(zonedDateTime.month / 3).toString();\n case 'QQQQ': {\n const quarter = Math.ceil(zonedDateTime.month / 3);\n return `${quarter}${getOrdinalSuffix(quarter)} quarter`;\n }\n case 'QQQ':\n return `Q${Math.ceil(zonedDateTime.month / 3)}`;\n case 'QQ':\n return Math.ceil(zonedDateTime.month / 3)\n .toString()\n .padStart(2, '0');\n case 'Q':\n return Math.ceil(zonedDateTime.month / 3).toString();\n\n // Month\n case 'MMMMM':\n return formatPart(zonedDateTime, 'month', 'narrow', locale);\n case 'MMMM':\n return formatPart(zonedDateTime, 'month', 'long', locale);\n case 'MMM':\n return formatPart(zonedDateTime, 'month', 'short', locale);\n case 'MM':\n return zonedDateTime.month.toString().padStart(2, '0');\n case 'Mo':\n return `${zonedDateTime.month}${getOrdinalSuffix(zonedDateTime.month)}`;\n case 'M':\n return zonedDateTime.month.toString();\n\n // Day of month\n case 'do':\n return `${zonedDateTime.day}${getOrdinalSuffix(zonedDateTime.day)}`;\n case 'dd':\n return zonedDateTime.day.toString().padStart(2, '0');\n case 'd':\n return zonedDateTime.day.toString();\n\n // Day of week\n case 'EEEEEE':\n return formatPart(zonedDateTime, 'weekday', 'short', locale).slice(0, 2);\n case 'EEEEE':\n return formatPart(zonedDateTime, 'weekday', 'narrow', locale);\n case 'EEEE':\n return formatPart(zonedDateTime, 'weekday', 'long', locale);\n case 'EEE':\n case 'EE':\n case 'E':\n return formatPart(zonedDateTime, 'weekday', 'short', locale);\n\n // AM/PM\n case 'aaaaa': {\n const period = formatPart(zonedDateTime, 'dayPeriod', 'narrow', locale).toLowerCase();\n return period.charAt(0);\n }\n case 'aaaa': {\n const period = formatPart(zonedDateTime, 'dayPeriod', 'short', locale);\n return period === 'AM' ? 'a.m.' : 'p.m.';\n }\n case 'aaa':\n return formatPart(zonedDateTime, 'dayPeriod', 'short', locale).toLowerCase();\n case 'aa':\n case 'a':\n return formatPart(zonedDateTime, 'dayPeriod', 'short', locale);\n\n // Hour [0-23]\n case 'HH':\n return zonedDateTime.hour.toString().padStart(2, '0');\n case 'H':\n return zonedDateTime.hour.toString();\n\n // Hour [1-12]\n case 'hh': {\n const hour12 = zonedDateTime.hour % 12 || 12;\n return hour12.toString().padStart(2, '0');\n }\n case 'h': {\n const hour12 = zonedDateTime.hour % 12 || 12;\n return hour12.toString();\n }\n\n // Minute\n case 'mm':\n return zonedDateTime.minute.toString().padStart(2, '0');\n case 'm':\n return zonedDateTime.minute.toString();\n\n // Second\n case 'ss':\n return zonedDateTime.second.toString().padStart(2, '0');\n case 's':\n return zonedDateTime.second.toString();\n\n // Fractional seconds\n case 'SSS':\n return zonedDateTime.millisecond.toString().padStart(3, '0');\n case 'SS':\n return Math.floor(zonedDateTime.millisecond / 10)\n .toString()\n .padStart(2, '0');\n case 'S':\n return Math.floor(zonedDateTime.millisecond / 100).toString();\n\n // Timezone\n case 'XXXXX': {\n const offset = getTimezoneOffset(zonedDateTime);\n return offset === '+00:00' ? 'Z' : offset;\n }\n case 'XXXX': {\n const offset = getTimezoneOffset(zonedDateTime).replace(':', '');\n return offset === '+0000' ? 'Z' : offset;\n }\n case 'XXX': {\n const offset = getTimezoneOffset(zonedDateTime);\n return offset === '+00:00' ? 'Z' : offset;\n }\n case 'XX': {\n const offset = getTimezoneOffset(zonedDateTime).replace(':', '');\n return offset === '+0000' ? 'Z' : offset;\n }\n case 'X': {\n const offset = getTimezoneOffset(zonedDateTime);\n if (offset === '+00:00') return 'Z';\n const [hours] = offset.split(':');\n return hours || '+00';\n }\n case 'xxxxx':\n return getTimezoneOffset(zonedDateTime);\n case 'xxxx':\n return getTimezoneOffset(zonedDateTime).replace(':', '');\n case 'xxx':\n return getTimezoneOffset(zonedDateTime);\n case 'xx':\n return getTimezoneOffset(zonedDateTime).replace(':', '');\n case 'x': {\n const offset = getTimezoneOffset(zonedDateTime);\n const [hours] = offset.split(':');\n return hours || '+00';\n }\n case 'zzzz':\n return formatPart(zonedDateTime, 'timeZoneName', 'long', locale);\n case 'zzz':\n case 'zz':\n case 'z':\n return formatPart(zonedDateTime, 'timeZoneName', 'short', locale);\n\n // Timestamps\n case 'T':\n return zonedDateTime.epochMilliseconds.toString();\n case 't':\n return Math.floor(zonedDateTime.epochMilliseconds / 1000).toString();\n\n default:\n return token;\n }\n}\n\nfunction formatPart(\n zonedDateTime: Temporal.ZonedDateTime,\n part: 'era' | 'year' | 'month' | 'weekday' | 'day' | 'dayPeriod' | 'hour' | 'minute' | 'second' | 'timeZoneName',\n style: 'narrow' | 'short' | 'long' | 'numeric' | '2-digit',\n locale: string\n): string {\n const options: Intl.DateTimeFormatOptions = {};\n\n if (part === 'dayPeriod') {\n // dayPeriod needs hour to be present\n options.hour = 'numeric';\n options.hour12 = true;\n } else {\n options[part] = style as any;\n }\n\n const formatted = zonedDateTime.toLocaleString(locale, options);\n\n if (part === 'dayPeriod') {\n // Extract just the AM/PM part\n const match = formatted.match(/\\b(AM|PM|am|pm|a\\.m\\.|p\\.m\\.)\\b/);\n return match ? match[0] : formatted.split(' ').pop() || '';\n }\n\n return formatted;\n}\n\nfunction getOrdinalSuffix(num: number): string {\n const j = num % 10;\n const k = num % 100;\n if (j === 1 && k !== 11) return 'st';\n if (j === 2 && k !== 12) return 'nd';\n if (j === 3 && k !== 13) return 'rd';\n return 'th';\n}\n\nfunction getTimezoneOffset(zonedDateTime: Temporal.ZonedDateTime): string {\n const offsetNs = zonedDateTime.offsetNanoseconds;\n const offsetMinutes = offsetNs / (60 * 1e9);\n const sign = offsetMinutes >= 0 ? '+' : '-';\n const absMinutes = Math.abs(offsetMinutes);\n const hours = Math.floor(absMinutes / 60);\n const minutes = absMinutes % 60;\n return `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeTemporalInput
|
|
3
|
+
} from "./chunk-MJSZNWCV.js";
|
|
4
|
+
|
|
5
|
+
// src/startOfWeek.ts
|
|
6
|
+
function startOfWeek(input) {
|
|
7
|
+
const zonedDateTime = normalizeTemporalInput(input);
|
|
8
|
+
const dayOfWeek = zonedDateTime.dayOfWeek;
|
|
9
|
+
const daysToSubtract = dayOfWeek - 1;
|
|
10
|
+
const monday = zonedDateTime.subtract({ days: daysToSubtract });
|
|
11
|
+
return monday.startOfDay();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
startOfWeek
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=chunk-2WMXB7QL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/startOfWeek.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the first moment of the week (Monday at midnight).\n * Uses ISO 8601 week definition: weeks start on Monday.\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at Monday 00:00:00.000000000\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z'); // Monday\n * const start = startOfWeek(instant);\n * // 2025-01-20T00:00:00Z[UTC] (same day, it's already Monday)\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-22T15:30:00-05:00[America/New_York]'); // Wednesday\n * const start = startOfWeek(zoned);\n * // 2025-01-20T00:00:00-05:00[America/New_York] (previous Monday)\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-22T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const start = startOfWeek(nyTime);\n * // 2025-01-20T00:00:00-05:00[America/New_York]\n * ```\n */\nexport function startOfWeek(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Get the day of week (1 = Monday, 7 = Sunday in ISO 8601)\n const dayOfWeek = zonedDateTime.dayOfWeek;\n\n // Calculate days to subtract to get to Monday\n const daysToSubtract = dayOfWeek - 1;\n\n // Go to Monday, then get start of that day\n const monday = zonedDateTime.subtract({ days: daysToSubtract });\n\n return monday.startOfDay();\n}\n"],"mappings":";;;;;AAmCO,SAAS,YACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,YAAY,cAAc;AAGhC,QAAM,iBAAiB,YAAY;AAGnC,QAAM,SAAS,cAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AAE9D,SAAO,OAAO,WAAW;AAC3B;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/endOfDay.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\n\n/**\n * Internal helper: Returns the last nanosecond of a given ZonedDateTime's day.\n * Used by endOfDay() and endOfWeek() to ensure consistent DST-safe behavior.\n */\nexport function getEndOfDay(\n zonedDateTime: Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n return zonedDateTime\n .startOfDay()\n .add({ days: 1 })\n .subtract({ nanoseconds: 1 });\n}\n"],"mappings":";AAMO,SAAS,YACd,eACwB;AACxB,SAAO,cACJ,WAAW,EACX,IAAI,EAAE,MAAM,EAAE,CAAC,EACf,SAAS,EAAE,aAAa,EAAE,CAAC;AAChC;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeTemporalInput
|
|
3
|
+
} from "./chunk-MJSZNWCV.js";
|
|
4
|
+
|
|
5
|
+
// src/isAfter.ts
|
|
6
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
7
|
+
function isAfter(date1, date2) {
|
|
8
|
+
const zoned1 = normalizeTemporalInput(date1);
|
|
9
|
+
const zoned2 = normalizeTemporalInput(date2);
|
|
10
|
+
return Temporal.ZonedDateTime.compare(zoned1, zoned2) > 0;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
isAfter
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=chunk-BBNNR2QH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/isAfter.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns true if the first datetime is after the second datetime.\n * Compares by the underlying instant (epoch time), not by calendar date/time.\n *\n * @param date1 - First datetime (Instant or ZonedDateTime)\n * @param date2 - Second datetime (Instant or ZonedDateTime)\n * @returns true if date1 is after date2, false otherwise\n *\n * @example\n * ```ts\n * const earlier = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');\n * const later = Temporal.ZonedDateTime.from('2025-01-20T16:00:00-05:00[America/New_York]');\n *\n * isAfter(later, earlier); // true\n * isAfter(earlier, later); // false\n * isAfter(earlier, earlier); // false\n * ```\n *\n * @example\n * ```ts\n * // Works with Instant too\n * const instant1 = Temporal.Instant.from('2025-01-20T15:00:00Z');\n * const instant2 = Temporal.Instant.from('2025-01-20T16:00:00Z');\n *\n * isAfter(instant2, instant1); // true\n * ```\n *\n * @example\n * ```ts\n * // Different timezones - compares by instant\n * const ny = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');\n * const tokyo = Temporal.ZonedDateTime.from('2025-01-21T00:00:00+09:00[Asia/Tokyo]');\n *\n * isAfter(tokyo, ny); // false\n * // NY 10:00 is 15:00 UTC, Tokyo 00:00 is 15:00 UTC the previous day (same instant)\n * ```\n */\nexport function isAfter(\n date1: Temporal.Instant | Temporal.ZonedDateTime,\n date2: Temporal.Instant | Temporal.ZonedDateTime\n): boolean {\n const zoned1 = normalizeTemporalInput(date1);\n const zoned2 = normalizeTemporalInput(date2);\n\n return Temporal.ZonedDateTime.compare(zoned1, zoned2) > 0;\n}\n"],"mappings":";;;;;AAAA,SAAS,gBAAgB;AAwClB,SAAS,QACd,OACA,OACS;AACT,QAAM,SAAS,uBAAuB,KAAK;AAC3C,QAAM,SAAS,uBAAuB,KAAK;AAE3C,SAAO,SAAS,cAAc,QAAQ,QAAQ,MAAM,IAAI;AAC1D;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getEndOfDay
|
|
3
|
+
} from "./chunk-AVGNRINZ.js";
|
|
4
|
+
import {
|
|
5
|
+
normalizeTemporalInput
|
|
6
|
+
} from "./chunk-MJSZNWCV.js";
|
|
7
|
+
|
|
8
|
+
// src/endOfDay.ts
|
|
9
|
+
import "@js-temporal/polyfill";
|
|
10
|
+
function endOfDay(input) {
|
|
11
|
+
const zonedDateTime = normalizeTemporalInput(input);
|
|
12
|
+
return getEndOfDay(zonedDateTime);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
endOfDay
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=chunk-CUMB4776.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/endOfDay.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { getEndOfDay } from './shared/endOfDay';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the last nanosecond of the day.\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at 23:59:59.999999999\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');\n * const end = endOfDay(instant);\n * // 2025-01-20T23:59:59.999999999Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');\n * const end = endOfDay(zoned);\n * // 2025-01-20T23:59:59.999999999-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const end = endOfDay(nyTime);\n * // 2025-01-20T23:59:59.999999999-05:00[America/New_York]\n * ```\n */\nexport function endOfDay(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n return getEndOfDay(zonedDateTime);\n}\n"],"mappings":";;;;;;;;AAAA,OAAyB;AAmClB,SAAS,SACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAElD,SAAO,YAAY,aAAa;AAClC;","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getEndOfDay
|
|
3
|
+
} from "./chunk-AVGNRINZ.js";
|
|
4
|
+
import {
|
|
5
|
+
normalizeTemporalInput
|
|
6
|
+
} from "./chunk-MJSZNWCV.js";
|
|
7
|
+
|
|
8
|
+
// src/endOfMonth.ts
|
|
9
|
+
function endOfMonth(input) {
|
|
10
|
+
const zonedDateTime = normalizeTemporalInput(input);
|
|
11
|
+
const daysInMonth = zonedDateTime.daysInMonth;
|
|
12
|
+
const lastDay = zonedDateTime.with({ day: daysInMonth });
|
|
13
|
+
return getEndOfDay(lastDay);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
endOfMonth
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=chunk-GM6RNAYE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/endOfMonth.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { getEndOfDay } from './shared/endOfDay';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the last moment of the month (last day at 23:59:59.999999999).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at the last day of the month at 23:59:59.999999999\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-15T12:00:00Z');\n * const end = endOfMonth(instant);\n * // 2025-01-31T23:59:59.999999999Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-02-15T15:30:00-05:00[America/New_York]');\n * const end = endOfMonth(zoned);\n * // 2025-02-28T23:59:59.999999999-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-15T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const end = endOfMonth(nyTime);\n * // 2025-01-31T23:59:59.999999999-05:00[America/New_York]\n * ```\n */\nexport function endOfMonth(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Get the number of days in this month\n const daysInMonth = zonedDateTime.daysInMonth;\n\n // Set day to last day of month, then get end of that day\n const lastDay = zonedDateTime.with({ day: daysInMonth });\n\n return getEndOfDay(lastDay);\n}\n"],"mappings":";;;;;;;;AAmCO,SAAS,WACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,cAAc,cAAc;AAGlC,QAAM,UAAU,cAAc,KAAK,EAAE,KAAK,YAAY,CAAC;AAEvD,SAAO,YAAY,OAAO;AAC5B;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeTemporalInput
|
|
3
|
+
} from "./chunk-MJSZNWCV.js";
|
|
4
|
+
|
|
5
|
+
// src/isBefore.ts
|
|
6
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
7
|
+
function isBefore(date1, date2) {
|
|
8
|
+
const zoned1 = normalizeTemporalInput(date1);
|
|
9
|
+
const zoned2 = normalizeTemporalInput(date2);
|
|
10
|
+
return Temporal.ZonedDateTime.compare(zoned1, zoned2) < 0;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
isBefore
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=chunk-IPJUERCK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/isBefore.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns true if the first datetime is before the second datetime.\n * Compares by the underlying instant (epoch time), not by calendar date/time.\n *\n * @param date1 - First datetime (Instant or ZonedDateTime)\n * @param date2 - Second datetime (Instant or ZonedDateTime)\n * @returns true if date1 is before date2, false otherwise\n *\n * @example\n * ```ts\n * const earlier = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');\n * const later = Temporal.ZonedDateTime.from('2025-01-20T16:00:00-05:00[America/New_York]');\n *\n * isBefore(earlier, later); // true\n * isBefore(later, earlier); // false\n * isBefore(earlier, earlier); // false\n * ```\n *\n * @example\n * ```ts\n * // Works with Instant too\n * const instant1 = Temporal.Instant.from('2025-01-20T15:00:00Z');\n * const instant2 = Temporal.Instant.from('2025-01-20T16:00:00Z');\n *\n * isBefore(instant1, instant2); // true\n * ```\n *\n * @example\n * ```ts\n * // Different timezones - compares by instant\n * const ny = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');\n * const tokyo = Temporal.ZonedDateTime.from('2025-01-21T00:00:00+09:00[Asia/Tokyo]');\n *\n * isBefore(ny, tokyo); // true\n * // NY 10:00 is 15:00 UTC, Tokyo 00:00 is 15:00 UTC the previous day\n * ```\n */\nexport function isBefore(\n date1: Temporal.Instant | Temporal.ZonedDateTime,\n date2: Temporal.Instant | Temporal.ZonedDateTime\n): boolean {\n const zoned1 = normalizeTemporalInput(date1);\n const zoned2 = normalizeTemporalInput(date2);\n\n return Temporal.ZonedDateTime.compare(zoned1, zoned2) < 0;\n}\n"],"mappings":";;;;;AAAA,SAAS,gBAAgB;AAwClB,SAAS,SACd,OACA,OACS;AACT,QAAM,SAAS,uBAAuB,KAAK;AAC3C,QAAM,SAAS,uBAAuB,KAAK;AAE3C,SAAO,SAAS,cAAc,QAAQ,QAAQ,MAAM,IAAI;AAC1D;","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// src/shared/normalizeTemporalInput.ts
|
|
2
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
3
|
+
function normalizeTemporalInput(input) {
|
|
4
|
+
return input instanceof Temporal.Instant ? input.toZonedDateTimeISO("UTC") : input;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
normalizeTemporalInput
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=chunk-MJSZNWCV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/normalizeTemporalInput.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\n\n/**\n * @internal\n * Normalizes input to ZonedDateTime. Converts Instant to UTC, or returns existing ZonedDateTime.\n * This is an internal helper - do not use directly.\n */\nexport function normalizeTemporalInput(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n return input instanceof Temporal.Instant\n ? input.toZonedDateTimeISO('UTC')\n : input;\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AAOlB,SAAS,uBACd,OACwB;AACxB,SAAO,iBAAiB,SAAS,UAC7B,MAAM,mBAAmB,KAAK,IAC9B;AACN;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeTemporalInput
|
|
3
|
+
} from "./chunk-MJSZNWCV.js";
|
|
4
|
+
|
|
5
|
+
// src/isSameDay.ts
|
|
6
|
+
import "@js-temporal/polyfill";
|
|
7
|
+
function isSameDay(date1, date2) {
|
|
8
|
+
const zoned1 = normalizeTemporalInput(date1);
|
|
9
|
+
const zoned2 = normalizeTemporalInput(date2);
|
|
10
|
+
return zoned1.year === zoned2.year && zoned1.month === zoned2.month && zoned1.day === zoned2.day;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
isSameDay
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=chunk-RW3C2677.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/isSameDay.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns true if both datetimes fall on the same calendar day.\n * Compares the year, month, and day fields directly.\n *\n * Instant inputs are converted to UTC. For ZonedDateTime inputs, their\n * timezone is preserved. Convert to a common timezone before calling if\n * you need to compare from a specific perspective.\n *\n * @param date1 - First datetime (Instant or ZonedDateTime)\n * @param date2 - Second datetime (Instant or ZonedDateTime)\n * @returns true if both dates are on the same calendar day, false otherwise\n *\n * @example\n * ```ts\n * // Same timezone, same day\n * const morning = Temporal.ZonedDateTime.from('2025-01-20T08:00:00Z[UTC]');\n * const evening = Temporal.ZonedDateTime.from('2025-01-20T23:00:00Z[UTC]');\n *\n * isSameDay(morning, evening); // true\n * ```\n *\n * @example\n * ```ts\n * // Same timezone, different days\n * const today = Temporal.ZonedDateTime.from('2025-01-20T23:59:59Z[UTC]');\n * const tomorrow = Temporal.ZonedDateTime.from('2025-01-21T00:00:00Z[UTC]');\n *\n * isSameDay(today, tomorrow); // false\n * ```\n *\n * @example\n * ```ts\n * // Different timezones - compares their local calendar days\n * const ny = Temporal.ZonedDateTime.from('2025-01-20T23:00:00-05:00[America/New_York]');\n * const tokyo = Temporal.ZonedDateTime.from('2025-01-21T13:00:00+09:00[Asia/Tokyo]');\n *\n * // Same instant, different calendar days from each person's perspective\n * isSameDay(ny, tokyo); // false (Jan 20 in NY, Jan 21 in Tokyo)\n *\n * // Convert to UTC to compare in UTC timezone\n * isSameDay(ny.withTimeZone('UTC'), tokyo.withTimeZone('UTC')); // true (both Jan 21 in UTC)\n *\n * // Convert to NY timezone to compare from NY perspective\n * isSameDay(ny, tokyo.withTimeZone('America/New_York')); // true (both Jan 20 in NY)\n * ```\n *\n * @example\n * ```ts\n * // Instant inputs are converted to UTC\n * const instant1 = Temporal.Instant.from('2025-01-20T10:00:00Z');\n * const instant2 = Temporal.Instant.from('2025-01-20T23:00:00Z');\n *\n * isSameDay(instant1, instant2); // true (both Jan 20 in UTC)\n * ```\n */\nexport function isSameDay(\n date1: Temporal.Instant | Temporal.ZonedDateTime,\n date2: Temporal.Instant | Temporal.ZonedDateTime\n): boolean {\n const zoned1 = normalizeTemporalInput(date1);\n const zoned2 = normalizeTemporalInput(date2);\n\n return (\n zoned1.year === zoned2.year &&\n zoned1.month === zoned2.month &&\n zoned1.day === zoned2.day\n );\n}\n"],"mappings":";;;;;AAAA,OAAyB;AA0DlB,SAAS,UACd,OACA,OACS;AACT,QAAM,SAAS,uBAAuB,KAAK;AAC3C,QAAM,SAAS,uBAAuB,KAAK;AAE3C,SACE,OAAO,SAAS,OAAO,QACvB,OAAO,UAAU,OAAO,SACxB,OAAO,QAAQ,OAAO;AAE1B;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeTemporalInput
|
|
3
|
+
} from "./chunk-MJSZNWCV.js";
|
|
4
|
+
|
|
5
|
+
// src/startOfMonth.ts
|
|
6
|
+
function startOfMonth(input) {
|
|
7
|
+
const zonedDateTime = normalizeTemporalInput(input);
|
|
8
|
+
const firstDay = zonedDateTime.with({ day: 1 });
|
|
9
|
+
return firstDay.startOfDay();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
startOfMonth
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=chunk-TU2UNOOW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/startOfMonth.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the first moment of the month (day 1 at midnight).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at the 1st day of the month at 00:00:00.000000000\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-15T12:00:00Z');\n * const start = startOfMonth(instant);\n * // 2025-01-01T00:00:00Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-15T15:30:00-05:00[America/New_York]');\n * const start = startOfMonth(zoned);\n * // 2025-01-01T00:00:00-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-15T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const start = startOfMonth(nyTime);\n * // 2025-01-01T00:00:00-05:00[America/New_York]\n * ```\n */\nexport function startOfMonth(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Set day to 1, then get start of that day\n const firstDay = zonedDateTime.with({ day: 1 });\n\n return firstDay.startOfDay();\n}\n"],"mappings":";;;;;AAkCO,SAAS,aACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,WAAW,cAAc,KAAK,EAAE,KAAK,EAAE,CAAC;AAE9C,SAAO,SAAS,WAAW;AAC7B;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeTemporalInput
|
|
3
|
+
} from "./chunk-MJSZNWCV.js";
|
|
4
|
+
|
|
5
|
+
// src/startOfDay.ts
|
|
6
|
+
function startOfDay(input) {
|
|
7
|
+
const zonedDateTime = normalizeTemporalInput(input);
|
|
8
|
+
return zonedDateTime.startOfDay();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
startOfDay
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=chunk-TW5EV3DH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/startOfDay.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the first moment of the day (midnight).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at 00:00:00.000000000\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');\n * const start = startOfDay(instant);\n * // 2025-01-20T00:00:00Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');\n * const start = startOfDay(zoned);\n * // 2025-01-20T00:00:00-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const start = startOfDay(nyTime);\n * // 2025-01-20T00:00:00-05:00[America/New_York]\n * ```\n */\nexport function startOfDay(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n return zonedDateTime.startOfDay();\n}\n"],"mappings":";;;;;AAkCO,SAAS,WACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAElD,SAAO,cAAc,WAAW;AAClC;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getEndOfDay
|
|
3
|
+
} from "./chunk-AVGNRINZ.js";
|
|
4
|
+
import {
|
|
5
|
+
normalizeTemporalInput
|
|
6
|
+
} from "./chunk-MJSZNWCV.js";
|
|
7
|
+
|
|
8
|
+
// src/endOfYear.ts
|
|
9
|
+
function endOfYear(input) {
|
|
10
|
+
const zonedDateTime = normalizeTemporalInput(input);
|
|
11
|
+
const monthsInYear = zonedDateTime.monthsInYear;
|
|
12
|
+
const lastMonth = zonedDateTime.with({ month: monthsInYear });
|
|
13
|
+
const lastDay = lastMonth.with({ day: lastMonth.daysInMonth });
|
|
14
|
+
return getEndOfDay(lastDay);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export {
|
|
18
|
+
endOfYear
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=chunk-XDVUGTUV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/endOfYear.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { getEndOfDay } from './shared/endOfDay';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the last moment of the year (last day at 23:59:59.999999999).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at the last day of the year at 23:59:59.999999999\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-06-15T12:00:00Z');\n * const end = endOfYear(instant);\n * // 2025-12-31T23:59:59.999999999Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-06-15T15:30:00-05:00[America/New_York]');\n * const end = endOfYear(zoned);\n * // 2025-12-31T23:59:59.999999999-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-06-15T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const end = endOfYear(nyTime);\n * // 2025-12-31T23:59:59.999999999-05:00[America/New_York]\n * ```\n */\nexport function endOfYear(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Get the number of months in this year\n const monthsInYear = zonedDateTime.monthsInYear;\n\n // Set to last month, then get last day of that month\n const lastMonth = zonedDateTime.with({ month: monthsInYear });\n const lastDay = lastMonth.with({ day: lastMonth.daysInMonth });\n\n return getEndOfDay(lastDay);\n}\n"],"mappings":";;;;;;;;AAmCO,SAAS,UACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,eAAe,cAAc;AAGnC,QAAM,YAAY,cAAc,KAAK,EAAE,OAAO,aAAa,CAAC;AAC5D,QAAM,UAAU,UAAU,KAAK,EAAE,KAAK,UAAU,YAAY,CAAC;AAE7D,SAAO,YAAY,OAAO;AAC5B;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getEndOfDay
|
|
3
|
+
} from "./chunk-AVGNRINZ.js";
|
|
4
|
+
import {
|
|
5
|
+
normalizeTemporalInput
|
|
6
|
+
} from "./chunk-MJSZNWCV.js";
|
|
7
|
+
|
|
8
|
+
// src/endOfWeek.ts
|
|
9
|
+
function endOfWeek(input) {
|
|
10
|
+
const zonedDateTime = normalizeTemporalInput(input);
|
|
11
|
+
const dayOfWeek = zonedDateTime.dayOfWeek;
|
|
12
|
+
const daysToAdd = 7 - dayOfWeek;
|
|
13
|
+
const sunday = zonedDateTime.add({ days: daysToAdd });
|
|
14
|
+
return getEndOfDay(sunday);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export {
|
|
18
|
+
endOfWeek
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=chunk-XVJJR7H6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/endOfWeek.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { getEndOfDay } from './shared/endOfDay';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the last moment of the week (Sunday at 23:59:59.999999999).\n * Uses ISO 8601 week definition: weeks end on Sunday.\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at Sunday 23:59:59.999999999\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z'); // Monday\n * const end = endOfWeek(instant);\n * // 2025-01-26T23:59:59.999999999Z[UTC] (next Sunday)\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-22T15:30:00-05:00[America/New_York]'); // Wednesday\n * const end = endOfWeek(zoned);\n * // 2025-01-26T23:59:59.999999999-05:00[America/New_York] (next Sunday)\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-22T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const end = endOfWeek(nyTime);\n * // 2025-01-26T23:59:59.999999999-05:00[America/New_York]\n * ```\n */\nexport function endOfWeek(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Get the day of week (1 = Monday, 7 = Sunday in ISO 8601)\n const dayOfWeek = zonedDateTime.dayOfWeek;\n\n // Calculate days to add to get to Sunday\n const daysToAdd = 7 - dayOfWeek;\n\n // Go to Sunday, then get end of that day\n const sunday = zonedDateTime.add({ days: daysToAdd });\n\n return getEndOfDay(sunday);\n}\n"],"mappings":";;;;;;;;AAoCO,SAAS,UACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,YAAY,cAAc;AAGhC,QAAM,YAAY,IAAI;AAGtB,QAAM,SAAS,cAAc,IAAI,EAAE,MAAM,UAAU,CAAC;AAEpD,SAAO,YAAY,MAAM;AAC3B;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeTemporalInput
|
|
3
|
+
} from "./chunk-MJSZNWCV.js";
|
|
4
|
+
|
|
5
|
+
// src/startOfYear.ts
|
|
6
|
+
function startOfYear(input) {
|
|
7
|
+
const zonedDateTime = normalizeTemporalInput(input);
|
|
8
|
+
const firstDay = zonedDateTime.with({ month: 1, day: 1 });
|
|
9
|
+
return firstDay.startOfDay();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
startOfYear
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=chunk-YR2UCUIT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/startOfYear.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the first moment of the year (January 1 at midnight).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at January 1st at 00:00:00.000000000\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-06-15T12:00:00Z');\n * const start = startOfYear(instant);\n * // 2025-01-01T00:00:00Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-06-15T15:30:00-05:00[America/New_York]');\n * const start = startOfYear(zoned);\n * // 2025-01-01T00:00:00-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-06-15T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const start = startOfYear(nyTime);\n * // 2025-01-01T00:00:00-05:00[America/New_York]\n * ```\n */\nexport function startOfYear(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Set to January 1st, then get start of that day\n const firstDay = zonedDateTime.with({ month: 1, day: 1 });\n\n return firstDay.startOfDay();\n}\n"],"mappings":";;;;;AAkCO,SAAS,YACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,WAAW,cAAc,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,CAAC;AAExD,SAAO,SAAS,WAAW;AAC7B;","names":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Temporal } from '@js-temporal/polyfill';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a ZonedDateTime representing the last nanosecond of the day.
|
|
4
|
+
*
|
|
5
|
+
* @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime
|
|
6
|
+
* @returns ZonedDateTime at 23:59:59.999999999
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* // From Instant (always UTC)
|
|
11
|
+
* const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');
|
|
12
|
+
* const end = endOfDay(instant);
|
|
13
|
+
* // 2025-01-20T23:59:59.999999999Z[UTC]
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* // From ZonedDateTime (uses its timezone)
|
|
19
|
+
* const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');
|
|
20
|
+
* const end = endOfDay(zoned);
|
|
21
|
+
* // 2025-01-20T23:59:59.999999999-05:00[America/New_York]
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* // Need a different timezone? Convert first
|
|
27
|
+
* const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');
|
|
28
|
+
* const nyTime = instant.toZonedDateTimeISO('America/New_York');
|
|
29
|
+
* const end = endOfDay(nyTime);
|
|
30
|
+
* // 2025-01-20T23:59:59.999999999-05:00[America/New_York]
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function endOfDay(input: Temporal.Instant | Temporal.ZonedDateTime): Temporal.ZonedDateTime;
|
|
34
|
+
//# sourceMappingURL=endOfDay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endOfDay.d.ts","sourceRoot":"","sources":["../src/endOfDay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,GAC/C,QAAQ,CAAC,aAAa,CAIxB"}
|
package/dist/endOfDay.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endOfDay.test.d.ts","sourceRoot":"","sources":["../src/endOfDay.test.ts"],"names":[],"mappings":""}
|