datevolt 1.0.3 → 1.0.4
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 +97 -96
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,26 +4,30 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/datevolt)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
[](package.json)
|
|
7
|
+
[](https://reactnative.dev)
|
|
7
8
|
|
|
8
|
-
A lightweight, zero-dependency JavaScript date library
|
|
9
|
-
|
|
10
|
-
I built this because moment.js is massive (~72 KB gzipped) and causes issues in some React Native setups. datevolt gives you the same familiar API at a fraction of the size.
|
|
9
|
+
A complete, lightweight, zero-dependency JavaScript date library with a familiar chainable API. Built with React Native CLI in mind (Android + iOS, Hermes & JSC), and works just as well in Node.js and browsers.
|
|
11
10
|
|
|
12
11
|
---
|
|
13
12
|
|
|
14
13
|
## Why datevolt?
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
|
19
|
-
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
15
|
+
Most date libraries are either too heavy for mobile apps or too minimal to be useful. datevolt hits the middle ground — full-featured, tiny footprint, no dependencies, and no native modules.
|
|
16
|
+
|
|
17
|
+
| Feature | datevolt |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Size (gzipped) | ~8 KB |
|
|
20
|
+
| Size (minified) | ~25 KB |
|
|
21
|
+
| Dependencies | 0 |
|
|
22
|
+
| Tree-shakeable | ✅ |
|
|
23
|
+
| Immutable `.clone()` | ✅ |
|
|
24
|
+
| React Native (Hermes + JSC) | ✅ |
|
|
25
|
+
| Node.js | ✅ |
|
|
26
|
+
| Browser | ✅ |
|
|
27
|
+
| Chainable API | ✅ |
|
|
28
|
+
| Built-in i18n | ✅ |
|
|
25
29
|
|
|
26
|
-
No `Intl` dependency
|
|
30
|
+
No `Intl` dependency. No native modules. No configuration. Just install and use.
|
|
27
31
|
|
|
28
32
|
---
|
|
29
33
|
|
|
@@ -46,19 +50,19 @@ const datevolt = require('datevolt');
|
|
|
46
50
|
// or
|
|
47
51
|
import datevolt from 'datevolt';
|
|
48
52
|
|
|
49
|
-
datevolt().format('YYYY-MM-DD HH:mm:ss')
|
|
50
|
-
datevolt('2024-06-15').format('dddd, MMMM D, YYYY')
|
|
51
|
-
datevolt().add(7, 'days').format('DD MMM YYYY')
|
|
52
|
-
datevolt('2024-01-01').fromNow()
|
|
53
|
-
datevolt('2024-06-15').diff('2024-01-01', 'days')
|
|
54
|
-
datevolt('2024-06-15').isBefore('2024-12-31')
|
|
53
|
+
datevolt().format('YYYY-MM-DD HH:mm:ss') // "2024-06-15 14:30:00"
|
|
54
|
+
datevolt('2024-06-15').format('dddd, MMMM D, YYYY') // "Saturday, June 15, 2024"
|
|
55
|
+
datevolt().add(7, 'days').format('DD MMM YYYY') // "22 Jun 2024"
|
|
56
|
+
datevolt('2024-01-01').fromNow() // "6 months ago"
|
|
57
|
+
datevolt('2024-06-15').diff('2024-01-01', 'days') // 166
|
|
58
|
+
datevolt('2024-06-15').isBefore('2024-12-31') // true
|
|
55
59
|
```
|
|
56
60
|
|
|
57
61
|
---
|
|
58
62
|
|
|
59
63
|
## React Native
|
|
60
64
|
|
|
61
|
-
|
|
65
|
+
Works out of the box — no extra setup, no metro config changes needed.
|
|
62
66
|
|
|
63
67
|
```js
|
|
64
68
|
import datevolt from 'datevolt';
|
|
@@ -69,6 +73,8 @@ const DateDisplay = () => {
|
|
|
69
73
|
};
|
|
70
74
|
```
|
|
71
75
|
|
|
76
|
+
Tested on Android (Hermes) and iOS (JSC). Pure JavaScript — no native bridge needed.
|
|
77
|
+
|
|
72
78
|
---
|
|
73
79
|
|
|
74
80
|
## API Reference
|
|
@@ -76,23 +82,23 @@ const DateDisplay = () => {
|
|
|
76
82
|
### Parsing
|
|
77
83
|
|
|
78
84
|
```js
|
|
79
|
-
datevolt()
|
|
80
|
-
datevolt('2024-06-15')
|
|
81
|
-
datevolt('2024-06-15T10:30:00')
|
|
82
|
-
datevolt('2024-06-15T10:30:00Z')
|
|
83
|
-
datevolt('2024-06-15T10:30:00+05:30')
|
|
84
|
-
datevolt('15/06/2024', 'DD/MM/YYYY')
|
|
85
|
-
datevolt('15/06/2024', ['DD/MM/YYYY', 'YYYY-MM-DD'])
|
|
86
|
-
datevolt([2024, 5, 15])
|
|
87
|
-
datevolt([2024, 5, 15, 14, 30, 0, 0])
|
|
88
|
-
datevolt({ year: 2024, month: 5, day: 15 })
|
|
89
|
-
datevolt(1718438400000)
|
|
90
|
-
datevolt.unix(1718438400)
|
|
91
|
-
datevolt.utc('2024-06-15T10:30:00')
|
|
85
|
+
datevolt() // now
|
|
86
|
+
datevolt('2024-06-15') // ISO date (local midnight)
|
|
87
|
+
datevolt('2024-06-15T10:30:00') // ISO datetime
|
|
88
|
+
datevolt('2024-06-15T10:30:00Z') // UTC
|
|
89
|
+
datevolt('2024-06-15T10:30:00+05:30') // with offset
|
|
90
|
+
datevolt('15/06/2024', 'DD/MM/YYYY') // custom format
|
|
91
|
+
datevolt('15/06/2024', ['DD/MM/YYYY', 'YYYY-MM-DD']) // multiple formats
|
|
92
|
+
datevolt([2024, 5, 15]) // array [Y, M(0-based), D]
|
|
93
|
+
datevolt([2024, 5, 15, 14, 30, 0, 0]) // array with time
|
|
94
|
+
datevolt({ year: 2024, month: 5, day: 15 }) // object
|
|
95
|
+
datevolt(1718438400000) // unix milliseconds
|
|
96
|
+
datevolt.unix(1718438400) // unix seconds
|
|
97
|
+
datevolt.utc('2024-06-15T10:30:00') // UTC mode
|
|
92
98
|
|
|
93
99
|
// Validation
|
|
94
|
-
datevolt('2024-06-15').isValid()
|
|
95
|
-
datevolt('not-a-date').isValid()
|
|
100
|
+
datevolt('2024-06-15').isValid() // true
|
|
101
|
+
datevolt('not-a-date').isValid() // false
|
|
96
102
|
```
|
|
97
103
|
|
|
98
104
|
---
|
|
@@ -102,13 +108,13 @@ datevolt('not-a-date').isValid() // false
|
|
|
102
108
|
```js
|
|
103
109
|
const d = datevolt('2024-06-15T14:30:45.123');
|
|
104
110
|
|
|
105
|
-
d.year() // 2024
|
|
106
|
-
d.month() // 5
|
|
107
|
-
d.date() // 15
|
|
108
|
-
d.day() // 6
|
|
109
|
-
d.hour() // 14
|
|
110
|
-
d.minute() // 30
|
|
111
|
-
d.second() // 45
|
|
111
|
+
d.year() // 2024 → d.year(2025)
|
|
112
|
+
d.month() // 5 → d.month(0) (0-based, Jan = 0)
|
|
113
|
+
d.date() // 15 → d.date(1)
|
|
114
|
+
d.day() // 6 → d.day(1) (0 = Sun, 6 = Sat)
|
|
115
|
+
d.hour() // 14 → d.hour(9)
|
|
116
|
+
d.minute() // 30 → d.minute(0)
|
|
117
|
+
d.second() // 45 → d.second(0)
|
|
112
118
|
d.millisecond() // 123
|
|
113
119
|
|
|
114
120
|
d.quarter() // 2
|
|
@@ -116,10 +122,10 @@ d.dayOfYear() // 167
|
|
|
116
122
|
d.daysInMonth() // 30
|
|
117
123
|
d.week() // ISO week number
|
|
118
124
|
d.isoWeek()
|
|
119
|
-
d.isoWeekday() // 1=Mon ... 7=Sun
|
|
125
|
+
d.isoWeekday() // 1 = Mon ... 7 = Sun
|
|
120
126
|
d.weeksInYear()
|
|
121
127
|
|
|
122
|
-
// Generic
|
|
128
|
+
// Generic
|
|
123
129
|
d.get('year') // 2024
|
|
124
130
|
d.set('year', 2025) // chainable
|
|
125
131
|
```
|
|
@@ -139,10 +145,10 @@ datevolt().add({ days: 1, hours: 2, minutes: 30 }) // object form
|
|
|
139
145
|
datevolt().subtract(1, 'week')
|
|
140
146
|
datevolt().subtract(3, 'months')
|
|
141
147
|
|
|
142
|
-
//
|
|
148
|
+
// Chainable
|
|
143
149
|
datevolt('2024-01-01').add(1, 'year').subtract(3, 'months').startOf('month')
|
|
144
150
|
|
|
145
|
-
// startOf
|
|
151
|
+
// startOf / endOf
|
|
146
152
|
datevolt().startOf('year') // Jan 1, 00:00:00.000
|
|
147
153
|
datevolt().startOf('month') // 1st of month, 00:00:00.000
|
|
148
154
|
datevolt().startOf('week')
|
|
@@ -151,9 +157,8 @@ datevolt().startOf('hour')
|
|
|
151
157
|
datevolt().startOf('quarter')
|
|
152
158
|
datevolt().startOf('isoWeek')
|
|
153
159
|
|
|
154
|
-
// endOf
|
|
155
160
|
datevolt().endOf('year') // Dec 31, 23:59:59.999
|
|
156
|
-
datevolt().endOf('month') // last day
|
|
161
|
+
datevolt().endOf('month') // last day, 23:59:59.999
|
|
157
162
|
|
|
158
163
|
datevolt().clone() // immutable copy
|
|
159
164
|
```
|
|
@@ -175,7 +180,7 @@ datevolt().format('LLL') // "June 15, 2024 2:30 PM"
|
|
|
175
180
|
datevolt().format('LLLL') // "Saturday, June 15, 2024 2:30 PM"
|
|
176
181
|
```
|
|
177
182
|
|
|
178
|
-
**Tokens
|
|
183
|
+
**Format Tokens**
|
|
179
184
|
|
|
180
185
|
| Token | Output | Description |
|
|
181
186
|
|-------|--------|-------------|
|
|
@@ -206,13 +211,13 @@ datevolt().format('LLLL') // "Saturday, June 15, 2024 2:30 PM
|
|
|
206
211
|
### Relative Time
|
|
207
212
|
|
|
208
213
|
```js
|
|
209
|
-
datevolt('2024-01-01').fromNow()
|
|
210
|
-
datevolt().add(2, 'hours').fromNow()
|
|
211
|
-
datevolt().subtract(3, 'days').fromNow(true)
|
|
214
|
+
datevolt('2024-01-01').fromNow() // "6 months ago"
|
|
215
|
+
datevolt().add(2, 'hours').fromNow() // "in 2 hours"
|
|
216
|
+
datevolt().subtract(3, 'days').fromNow(true) // "3 days" (no suffix)
|
|
212
217
|
|
|
213
|
-
datevolt('2024-01-01').from('2024-06-15')
|
|
214
|
-
datevolt().add(5, 'minutes').toNow()
|
|
215
|
-
datevolt('2024-01-01').to('2024-06-15')
|
|
218
|
+
datevolt('2024-01-01').from('2024-06-15') // "6 months ago"
|
|
219
|
+
datevolt().add(5, 'minutes').toNow() // "in 5 minutes"
|
|
220
|
+
datevolt('2024-01-01').to('2024-06-15') // "in 6 months"
|
|
216
221
|
```
|
|
217
222
|
|
|
218
223
|
---
|
|
@@ -220,11 +225,11 @@ datevolt('2024-01-01').to('2024-06-15') // "in 6 months"
|
|
|
220
225
|
### Calendar
|
|
221
226
|
|
|
222
227
|
```js
|
|
223
|
-
datevolt().calendar()
|
|
224
|
-
datevolt().add(1, 'day').calendar()
|
|
225
|
-
datevolt().subtract(1, 'day').calendar()
|
|
226
|
-
datevolt().add(3, 'days').calendar()
|
|
227
|
-
datevolt().subtract(7, 'days').calendar()// "06/08/2024"
|
|
228
|
+
datevolt().calendar() // "Today at 2:30 PM"
|
|
229
|
+
datevolt().add(1, 'day').calendar() // "Tomorrow at 2:30 PM"
|
|
230
|
+
datevolt().subtract(1, 'day').calendar() // "Yesterday at 2:30 PM"
|
|
231
|
+
datevolt().add(3, 'days').calendar() // "Tuesday at 2:30 PM"
|
|
232
|
+
datevolt().subtract(7, 'days').calendar() // "06/08/2024"
|
|
228
233
|
```
|
|
229
234
|
|
|
230
235
|
---
|
|
@@ -232,11 +237,11 @@ datevolt().subtract(7, 'days').calendar()// "06/08/2024"
|
|
|
232
237
|
### Diff
|
|
233
238
|
|
|
234
239
|
```js
|
|
235
|
-
datevolt('2024-06-15').diff('2024-01-01', 'days')
|
|
236
|
-
datevolt('2024-06-15').diff('2024-01-01', 'months')
|
|
237
|
-
datevolt('2024-06-15').diff('2020-01-01', 'years')
|
|
240
|
+
datevolt('2024-06-15').diff('2024-01-01', 'days') // 166
|
|
241
|
+
datevolt('2024-06-15').diff('2024-01-01', 'months') // 5
|
|
242
|
+
datevolt('2024-06-15').diff('2020-01-01', 'years') // 4
|
|
238
243
|
datevolt('2024-06-15T12:00').diff('2024-06-15T10:00', 'hours') // 2
|
|
239
|
-
datevolt('2024-06-15').diff('2024-01-01', 'days', true)
|
|
244
|
+
datevolt('2024-06-15').diff('2024-01-01', 'days', true) // 166.xxx (float)
|
|
240
245
|
```
|
|
241
246
|
|
|
242
247
|
---
|
|
@@ -244,12 +249,12 @@ datevolt('2024-06-15').diff('2024-01-01', 'days', true) // 166.xxx (float)
|
|
|
244
249
|
### Query & Comparison
|
|
245
250
|
|
|
246
251
|
```js
|
|
247
|
-
datevolt('2024-01-01').isBefore('2024-06-15')
|
|
248
|
-
datevolt('2024-06-15').isAfter('2024-01-01')
|
|
249
|
-
datevolt('2024-06-15T10:00').isSame('2024-06-15T18:00', 'day')
|
|
250
|
-
datevolt('2024-01-01').isSameOrBefore('2024-01-01')
|
|
251
|
-
datevolt('2024-06-15').isSameOrAfter('2024-06-15')
|
|
252
|
-
datevolt('2024-03-15').isBetween('2024-01-01', '2024-12-31')
|
|
252
|
+
datevolt('2024-01-01').isBefore('2024-06-15') // true
|
|
253
|
+
datevolt('2024-06-15').isAfter('2024-01-01') // true
|
|
254
|
+
datevolt('2024-06-15T10:00').isSame('2024-06-15T18:00', 'day') // true
|
|
255
|
+
datevolt('2024-01-01').isSameOrBefore('2024-01-01') // true
|
|
256
|
+
datevolt('2024-06-15').isSameOrAfter('2024-06-15') // true
|
|
257
|
+
datevolt('2024-03-15').isBetween('2024-01-01', '2024-12-31') // true
|
|
253
258
|
datevolt('2024-01-01').isBetween('2024-01-01', '2024-12-31', null, '[]') // inclusive
|
|
254
259
|
|
|
255
260
|
datevolt('2024-06-15').isLeapYear() // true
|
|
@@ -265,14 +270,14 @@ datevolt.isDate(new Date()) // true
|
|
|
265
270
|
```js
|
|
266
271
|
// UTC mode
|
|
267
272
|
datevolt.utc('2024-06-15T10:30:00').format('HH:mm') // always UTC hours
|
|
268
|
-
datevolt.utc().isUTC()
|
|
269
|
-
datevolt.utc().local()
|
|
273
|
+
datevolt.utc().isUTC() // true
|
|
274
|
+
datevolt.utc().local() // switch back to local
|
|
270
275
|
|
|
271
276
|
// UTC offset
|
|
272
|
-
datevolt().utcOffset()
|
|
273
|
-
datevolt().utcOffset('+05:30')
|
|
274
|
-
datevolt().utcOffset(330)
|
|
275
|
-
datevolt().utcOffset(0, true)
|
|
277
|
+
datevolt().utcOffset() // offset in minutes
|
|
278
|
+
datevolt().utcOffset('+05:30') // set by string
|
|
279
|
+
datevolt().utcOffset(330) // set by minutes
|
|
280
|
+
datevolt().utcOffset(0, true) // keep local time, change offset
|
|
276
281
|
```
|
|
277
282
|
|
|
278
283
|
---
|
|
@@ -286,7 +291,7 @@ d.asHours() // 48
|
|
|
286
291
|
d.asMinutes() // 2880
|
|
287
292
|
|
|
288
293
|
datevolt.duration({ hours: 1, minutes: 30 }).asMinutes() // 90
|
|
289
|
-
datevolt.duration('P1Y2M3DT4H5M6S') // ISO 8601
|
|
294
|
+
datevolt.duration('P1Y2M3DT4H5M6S') // ISO 8601 duration
|
|
290
295
|
|
|
291
296
|
datevolt.duration(1, 'day').humanize() // "a day"
|
|
292
297
|
datevolt.duration(1, 'day').humanize(true) // "in a day"
|
|
@@ -296,7 +301,7 @@ d.add(1, 'hour').subtract(30, 'minutes')
|
|
|
296
301
|
d.clone()
|
|
297
302
|
d.toISOString() // "P2D"
|
|
298
303
|
|
|
299
|
-
//
|
|
304
|
+
// Pass duration directly into add()
|
|
300
305
|
datevolt().add(datevolt.duration(2, 'hours'))
|
|
301
306
|
|
|
302
307
|
datevolt.isDuration(d) // true
|
|
@@ -309,24 +314,24 @@ datevolt.isDuration(d) // true
|
|
|
309
314
|
7 built-in locales: `en`, `hi`, `es`, `fr`, `de`, `ar`, `ja`
|
|
310
315
|
|
|
311
316
|
```js
|
|
312
|
-
//
|
|
317
|
+
// Set global locale
|
|
313
318
|
datevolt.locale('hi');
|
|
314
319
|
datevolt().format('MMMM D, YYYY'); // "जून 15, 2024"
|
|
315
320
|
|
|
316
|
-
// Per-instance
|
|
321
|
+
// Per-instance locale
|
|
317
322
|
datevolt().locale('es').format('MMMM'); // "junio"
|
|
318
323
|
|
|
319
|
-
// List available
|
|
324
|
+
// List all available
|
|
320
325
|
datevolt.locales(); // ['en', 'hi', 'es', 'fr', 'de', 'ar', 'ja']
|
|
321
326
|
|
|
322
|
-
//
|
|
327
|
+
// Define a custom locale
|
|
323
328
|
datevolt.defineLocale('mr', {
|
|
324
329
|
name: 'mr',
|
|
325
330
|
months: ['जानेवारी', 'फेब्रुवारी', 'मार्च', ...],
|
|
326
331
|
// ...
|
|
327
332
|
});
|
|
328
333
|
|
|
329
|
-
//
|
|
334
|
+
// Access locale data
|
|
330
335
|
datevolt.localeData('en').months
|
|
331
336
|
datevolt().localeData()
|
|
332
337
|
```
|
|
@@ -336,28 +341,24 @@ datevolt().localeData()
|
|
|
336
341
|
### Static Methods
|
|
337
342
|
|
|
338
343
|
```js
|
|
339
|
-
datevolt.max(a, b, c) // returns latest
|
|
340
|
-
datevolt.min(a, b, c) // returns earliest
|
|
341
|
-
datevolt.invalid() // invalid datevolt instance
|
|
344
|
+
datevolt.max(a, b, c) // returns the latest date
|
|
345
|
+
datevolt.min(a, b, c) // returns the earliest date
|
|
346
|
+
datevolt.invalid() // returns an invalid datevolt instance
|
|
342
347
|
datevolt.normalizeUnits('y') // 'year'
|
|
343
348
|
datevolt.version // '1.0.1'
|
|
344
|
-
datevolt.fn // prototype
|
|
349
|
+
datevolt.fn // prototype — use for plugins
|
|
345
350
|
```
|
|
346
351
|
|
|
347
352
|
---
|
|
348
353
|
|
|
349
|
-
##
|
|
354
|
+
## Familiar API
|
|
350
355
|
|
|
351
|
-
|
|
356
|
+
If you've used any chainable date library before, datevolt will feel right at home. The API follows widely adopted conventions in the JavaScript date ecosystem — parse, format, add, subtract, diff, fromNow, and more — all chainable and consistent.
|
|
352
357
|
|
|
353
358
|
```js
|
|
354
|
-
//
|
|
355
|
-
const
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
// After
|
|
359
|
-
const datevolt = require('datevolt');
|
|
360
|
-
datevolt().format('YYYY-MM-DD');
|
|
359
|
+
// Switching from another date library? It's usually just a one-line change:
|
|
360
|
+
// const datevolt = require('datevolt');
|
|
361
|
+
// Then use it the same way you always have.
|
|
361
362
|
```
|
|
362
363
|
|
|
363
364
|
---
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "datevolt",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "A complete, lightweight, zero-dependency date library with a moment.js-compatible API. Built for React Native CLI (Android & iOS), Node.js, and browsers.",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"react-native": "src/index.js",
|