From 1e9bcd7f1f8189653d4098e311f94a9e7ce316c6 Mon Sep 17 00:00:00 2001 From: Tomas Panek <34172483+tomaspanek@users.noreply.github.com> Date: Sat, 5 Aug 2023 03:28:03 +0000 Subject: [PATCH 1/3] Timezone Offset Fix & Parsing with Leading Zeros --- src/lib/isDate.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/lib/isDate.js b/src/lib/isDate.js index 9f1c6926b..862c3faa5 100644 --- a/src/lib/isDate.js +++ b/src/lib/isDate.js @@ -65,7 +65,19 @@ export default function isDate(input, options) { } } - return new Date(`${fullYear}-${dateObj.m}-${dateObj.d}`).getDate() === +dateObj.d; + let month = dateObj.m; + + if (dateObj.m.length === 1) { + month = `0${dateObj.m}`; + } + + let day = dateObj.d; + + if (dateObj.d.length === 1) { + day = `0${dateObj.d}`; + } + + return new Date(`${fullYear}-${month}-${day}T00:00:00`).getDate() === +dateObj.d; } if (!options.strictMode) { From 6f91909ae060ea63c249489bef4626b237d84648 Mon Sep 17 00:00:00 2001 From: Tomas Panek <34172483+tomaspanek@users.noreply.github.com> Date: Sat, 5 Aug 2023 13:31:21 +0000 Subject: [PATCH 2/3] `isDate` Timezone Mock Test, Support for NodeJS <8 --- package.json | 1 + src/lib/isDate.js | 2 +- test/validators.test.js | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 3f088d3ce..153e5c1a4 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "rimraf": "^3.0.0", "rollup": "^0.47.0", "rollup-plugin-babel": "^4.0.1", + "timezone-mock": "^1.3.6", "uglify-js": "^3.0.19" }, "scripts": { diff --git a/src/lib/isDate.js b/src/lib/isDate.js index 862c3faa5..f0b28917a 100644 --- a/src/lib/isDate.js +++ b/src/lib/isDate.js @@ -77,7 +77,7 @@ export default function isDate(input, options) { day = `0${dateObj.d}`; } - return new Date(`${fullYear}-${month}-${day}T00:00:00`).getDate() === +dateObj.d; + return new Date(`${fullYear}-${month}-${day}T00:00:00.000Z`).getUTCDate() === +dateObj.d; } if (!options.strictMode) { diff --git a/test/validators.test.js b/test/validators.test.js index 6bf812d15..b17ad60e5 100644 --- a/test/validators.test.js +++ b/test/validators.test.js @@ -1,5 +1,6 @@ import assert from 'assert'; import fs from 'fs'; +import timezone_mock from 'timezone-mock'; import { format } from 'util'; import vm from 'vm'; import validator from '../src/index'; @@ -13054,6 +13055,17 @@ describe('Validators', () => { '29.02.2020', ], }); + // emulating Pacific time zone offset & time + // which could potentially result in UTC conversion issues + timezone_mock.register('US/Pacific'); + test({ + validator: 'isDate', + valid: [ + new Date(), + '2023-08-04', + ], + }); + timezone_mock.unregister(); }); it('should validate time', () => { test({ From 873ed37f1ed41d3dd8da1ec2098a24c38e11e23b Mon Sep 17 00:00:00 2001 From: Tomas Panek <34172483+tomaspanek@users.noreply.github.com> Date: Sat, 5 Aug 2023 17:59:18 +0000 Subject: [PATCH 3/3] `isDate` Unit Test Resiliency Improvement --- test/validators.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/validators.test.js b/test/validators.test.js index b17ad60e5..8fa0f04ae 100644 --- a/test/validators.test.js +++ b/test/validators.test.js @@ -13061,8 +13061,8 @@ describe('Validators', () => { test({ validator: 'isDate', valid: [ - new Date(), - '2023-08-04', + new Date(2016, 2, 29), + '2017-08-04', ], }); timezone_mock.unregister();