Skip to content

Commit 3fc7bf1

Browse files
authored
feat(date): introduce anytime (#2096)
1 parent 4d0458c commit 3fc7bf1

File tree

5 files changed

+76
-5
lines changed

5 files changed

+76
-5
lines changed

docs/guide/upgrading.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -308,9 +308,9 @@ faker.number.float({ max: 100, precision: 0.01 }); // 35.21
308308
The method `faker.datatype.array` has been deprecated and will be removed in v9.
309309
If you need an array of useful values, you are better off creating your own one using `faker.helpers.multiple`.
310310

311-
### `faker.datatype.datetime` deprecated in favor of `faker.date.between`
311+
### `faker.datatype.datetime` deprecated in favor of `faker.date.between` and `faker.date.anytime`
312312

313-
The `datetime` method previously found in `faker.datatype` has been deprecated, use `faker.date.between` instead.
313+
The `datetime` method previously found in `faker.datatype` has been deprecated, use `faker.date.between` or `faker.date.anytime` instead.
314314

315315
### `allowLeadingZeros` behavior change in `faker.string.numeric`
316316

src/modules/datatype/index.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ export class DatatypeModule {
166166
* When not provided or larger than `8640000000000000`, `2100-01-01` is considered
167167
* as maximum generated date. Defaults to `4102444800000`.
168168
*
169+
* @see faker.date.anytime()
169170
* @see faker.date.between()
170171
*
171172
* @example
@@ -175,7 +176,7 @@ export class DatatypeModule {
175176
*
176177
* @since 5.5.0
177178
*
178-
* @deprecated Use `faker.date.between({ from: min, to: max })` instead.
179+
* @deprecated Use `faker.date.between({ from: min, to: max })` or `faker.date.anytime()` instead.
179180
*/
180181
datetime(
181182
options:
@@ -201,7 +202,7 @@ export class DatatypeModule {
201202
): Date {
202203
deprecated({
203204
deprecated: 'faker.datatype.datetime({ min, max })',
204-
proposed: 'faker.date.between({ from, to })',
205+
proposed: 'faker.date.between({ from, to }) or faker.date.anytime()',
205206
since: '8.0',
206207
until: '9.0',
207208
});

src/modules/date/index.ts

+35
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,41 @@ export class DateModule {
5151
}
5252
}
5353

54+
/**
55+
* Generates a random date that can be either in the past or in the future.
56+
*
57+
* @param options The optional options object.
58+
* @param options.refDate The date to use as reference point for the newly generated date. Defaults to `faker.defaultRefDate()`.
59+
*
60+
* @see faker.date.between() For dates in a specific range.
61+
* @see faker.date.past() For dates explicitly in the past.
62+
* @see faker.date.future() For dates explicitly in the future.
63+
*
64+
* @example
65+
* faker.date.anytime() // '2022-07-31T01:33:29.567Z'
66+
*
67+
* @since 8.0.0
68+
*/
69+
anytime(
70+
options: {
71+
/**
72+
* The date to use as reference point for the newly generated date.
73+
*
74+
* @default faker.defaultRefDate()
75+
*/
76+
refDate?: string | Date | number;
77+
} = {}
78+
): Date {
79+
const { refDate } = options;
80+
81+
const date = toDate(refDate, this.faker.defaultRefDate);
82+
83+
return this.between({
84+
from: new Date(date.getTime() - 1000 * 60 * 60 * 24 * 365),
85+
to: new Date(date.getTime() + 1000 * 60 * 60 * 24 * 365),
86+
});
87+
}
88+
5489
/**
5590
* Generates a random date in the past.
5691
*

test/__snapshots__/date.spec.ts.snap

+18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

3+
exports[`date > 42 > anytime > with only Date refDate 1`] = `2020-11-22T03:05:49.801Z`;
4+
5+
exports[`date > 42 > anytime > with only number refDate 1`] = `2020-11-22T03:05:49.801Z`;
6+
7+
exports[`date > 42 > anytime > with only string refDate 1`] = `2020-11-22T03:05:49.801Z`;
8+
39
exports[`date > 42 > between > with Date dates 1`] = `2021-03-15T19:30:57.091Z`;
410

511
exports[`date > 42 > between > with mixed dates 1`] = `2021-03-15T19:30:57.091Z`;
@@ -121,6 +127,12 @@ exports[`date > 42 > weekday > with abbreviated = true and context = true 1`] =
121127

122128
exports[`date > 42 > weekday > with context = true 1`] = `"Tuesday"`;
123129

130+
exports[`date > 1211 > anytime > with only Date refDate 1`] = `2021-12-31T12:49:38.848Z`;
131+
132+
exports[`date > 1211 > anytime > with only number refDate 1`] = `2021-12-31T12:49:38.848Z`;
133+
134+
exports[`date > 1211 > anytime > with only string refDate 1`] = `2021-12-31T12:49:38.848Z`;
135+
124136
exports[`date > 1211 > between > with Date dates 1`] = `2021-04-17T11:58:13.327Z`;
125137

126138
exports[`date > 1211 > between > with mixed dates 1`] = `2021-04-17T11:58:13.327Z`;
@@ -243,6 +255,12 @@ exports[`date > 1211 > weekday > with abbreviated = true and context = true 1`]
243255

244256
exports[`date > 1211 > weekday > with context = true 1`] = `"Saturday"`;
245257

258+
exports[`date > 1337 > anytime > with only Date refDate 1`] = `2020-08-31T23:49:36.088Z`;
259+
260+
exports[`date > 1337 > anytime > with only number refDate 1`] = `2020-08-31T23:49:36.088Z`;
261+
262+
exports[`date > 1337 > anytime > with only string refDate 1`] = `2020-08-31T23:49:36.088Z`;
263+
246264
exports[`date > 1337 > between > with Date dates 1`] = `2021-03-09T04:11:24.667Z`;
247265

248266
exports[`date > 1337 > between > with mixed dates 1`] = `2021-03-09T04:11:24.667Z`;

test/date.spec.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ const refDate = '2021-02-21T17:09:15.711Z';
1313

1414
describe('date', () => {
1515
seededTests(faker, 'date', (t) => {
16+
t.describe('anytime', (t) => {
17+
t.it('with only string refDate', { refDate })
18+
.it('with only Date refDate', { refDate: new Date(refDate) })
19+
.it('with only number refDate', {
20+
refDate: new Date(refDate).getTime(),
21+
});
22+
});
23+
1624
t.describeEach(
1725
'past',
1826
'future'
@@ -188,12 +196,21 @@ describe('date', () => {
188196
});
189197

190198
// No changes to these methods
191-
t.skip('birthdate').skip('month').skip('weekday');
199+
t.skip('anytime').skip('birthdate').skip('month').skip('weekday');
192200
});
193201
});
194202

195203
describe(`random seeded tests for seed ${faker.seed()}`, () => {
196204
for (let i = 1; i <= NON_SEEDED_BASED_RUN; i++) {
205+
describe('anytime()', () => {
206+
it('should return a date', () => {
207+
const actual = faker.date.anytime();
208+
209+
expect(actual).toBeDefined();
210+
expect(actual).toBeInstanceOf(Date);
211+
});
212+
});
213+
197214
describe('past()', () => {
198215
it('should return a date 5 years in the past', () => {
199216
const today = new Date();

0 commit comments

Comments
 (0)