1
1
import type { Faker } from '.' ;
2
2
import type { DateEntryDefinition } from './definitions' ;
3
3
4
+ /**
5
+ * Converts date passed as a string or Date to a Date object. If nothing passed, takes current date.
6
+ *
7
+ * @param date Date
8
+ */
9
+ function toDate ( date ?: string | Date ) : Date {
10
+ if ( date != null ) {
11
+ return new Date ( date instanceof Date ? date : Date . parse ( date ) ) ;
12
+ }
13
+
14
+ return new Date ( ) ;
15
+ }
16
+
17
+ /**
18
+ * Converts date passed as a string or Date to milliseconds. If nothing passed, takes current date.
19
+ *
20
+ * @param date Date
21
+ */
22
+ function toMilliseconds ( date ?: string | Date ) : number {
23
+ if ( date != null ) {
24
+ return date instanceof Date ? date . getTime ( ) : Date . parse ( date ) ;
25
+ }
26
+
27
+ return new Date ( ) . getTime ( ) ;
28
+ }
29
+
4
30
/**
5
31
* Module to generate dates.
6
32
*/
@@ -28,12 +54,8 @@ export class _Date {
28
54
* faker.date.past(10) // '2017-10-25T21:34:19.488Z'
29
55
* faker.date.past(10, '2020-01-01T00:00:00.000Z') // '2017-08-18T02:59:12.350Z'
30
56
*/
31
- past ( years ?: number , refDate ?: string ) : Date {
32
- let date = new Date ( ) ;
33
- if ( typeof refDate !== 'undefined' ) {
34
- date = new Date ( Date . parse ( refDate ) ) ;
35
- }
36
-
57
+ past ( years ?: number , refDate ?: string | Date ) : Date {
58
+ const date = toDate ( refDate ) ;
37
59
const range = {
38
60
min : 1000 ,
39
61
max : ( years || 1 ) * 365 * 24 * 3600 * 1000 ,
@@ -59,12 +81,8 @@ export class _Date {
59
81
* faker.date.future(10) // '2030-11-23T09:38:28.710Z'
60
82
* faker.date.future(10, '2020-01-01T00:00:00.000Z') // '2020-12-13T22:45:10.252Z'
61
83
*/
62
- future ( years ?: number , refDate ?: string ) : Date {
63
- let date = new Date ( ) ;
64
- if ( typeof refDate !== 'undefined' ) {
65
- date = new Date ( Date . parse ( refDate ) ) ;
66
- }
67
-
84
+ future ( years ?: number , refDate ?: string | Date ) : Date {
85
+ const date = toDate ( refDate ) ;
68
86
const range = {
69
87
min : 1000 ,
70
88
max : ( years || 1 ) * 365 * 24 * 3600 * 1000 ,
@@ -86,13 +104,12 @@ export class _Date {
86
104
* @example
87
105
* faker.date.between('2020-01-01T00:00:00.000Z', '2030-01-01T00:00:00.000Z') // '2026-05-16T02:22:53.002Z'
88
106
*/
89
- between ( from : string , to : string ) : Date {
90
- const fromMilli = Date . parse ( from ) ;
91
- const dateOffset = this . faker . datatype . number ( Date . parse ( to ) - fromMilli ) ;
92
-
93
- const newDate = new Date ( fromMilli + dateOffset ) ;
107
+ between ( from : string | Date , to : string | Date ) : Date {
108
+ const fromMs = toMilliseconds ( from ) ;
109
+ const toMs = toMilliseconds ( to ) ;
110
+ const dateOffset = this . faker . datatype . number ( toMs - fromMs ) ;
94
111
95
- return newDate ;
112
+ return new Date ( fromMs + dateOffset ) ;
96
113
}
97
114
98
115
/**
@@ -112,22 +129,18 @@ export class _Date {
112
129
* faker.date.betweens('2020-01-01T00:00:00.000Z', '2030-01-01T00:00:00.000Z', 2)
113
130
* // [ 2023-05-02T16:00:00.000Z, 2026-09-01T08:00:00.000Z ]
114
131
*/
115
- betweens ( from : string , to : string , num ?: number ) : Date [ ] {
132
+ betweens ( from : string | Date , to : string | Date , num ?: number ) : Date [ ] {
116
133
if ( typeof num === 'undefined' ) {
117
134
num = 3 ;
118
135
}
119
- const newDates : Date [ ] = [ ] ;
120
- let fromMilli = Date . parse ( from ) ;
121
- const dateOffset = ( Date . parse ( to ) - fromMilli ) / ( num + 1 ) ;
122
- let lastDate : string | Date = from ;
136
+
137
+ const dates : Date [ ] = [ ] ;
138
+
123
139
for ( let i = 0 ; i < num ; i ++ ) {
124
- // TODO @Shinigami 92 2022-01-11: It may be a bug that `lastDate` is passed to parse if it's a `Date` not a `string`
125
- // @ts -expect-error
126
- fromMilli = Date . parse ( lastDate ) ;
127
- lastDate = new Date ( fromMilli + dateOffset ) ;
128
- newDates . push ( lastDate ) ;
140
+ dates . push ( this . between ( from , to ) ) ;
129
141
}
130
- return newDates ;
142
+
143
+ return dates . sort ( ( a , b ) => a . getTime ( ) - b . getTime ( ) ) ;
131
144
}
132
145
133
146
/**
@@ -143,12 +156,8 @@ export class _Date {
143
156
* faker.date.recent(10) // '2022-01-29T06:12:12.829Z'
144
157
* faker.date.recent(10, '2020-01-01T00:00:00.000Z') // '2019-12-27T18:11:19.117Z'
145
158
*/
146
- recent ( days ?: number , refDate ?: string ) : Date {
147
- let date = new Date ( ) ;
148
- if ( typeof refDate !== 'undefined' ) {
149
- date = new Date ( Date . parse ( refDate ) ) ;
150
- }
151
-
159
+ recent ( days ?: number , refDate ?: string | Date ) : Date {
160
+ const date = toDate ( refDate ) ;
152
161
const range = {
153
162
min : 1000 ,
154
163
max : ( days || 1 ) * 24 * 3600 * 1000 ,
@@ -174,12 +183,8 @@ export class _Date {
174
183
* faker.date.soon(10) // '2022-02-11T05:14:39.138Z'
175
184
* faker.date.soon(10, '2020-01-01T00:00:00.000Z') // '2020-01-01T02:40:44.990Z'
176
185
*/
177
- soon ( days ?: number , refDate ?: string ) : Date {
178
- let date = new Date ( ) ;
179
- if ( typeof refDate !== 'undefined' ) {
180
- date = new Date ( Date . parse ( refDate ) ) ;
181
- }
182
-
186
+ soon ( days ?: number , refDate ?: string | Date ) : Date {
187
+ const date = toDate ( refDate ) ;
183
188
const range = {
184
189
min : 1000 ,
185
190
max : ( days || 1 ) * 24 * 3600 * 1000 ,
0 commit comments