Я пытаюсь написать функцию, которая будет принимать строку типа 07/2020
, а затем возвращать, если прошло более трех месяцев.
Я написал функцию isMoreThan3MonthsHence
, в которой я достаточно уверен работает правильно:
const isMoreThan3MonthsHence = ({ utcYear, utcMonth },
now = new Date,
target = new Date(Date.UTC(utcYear, utcMonth)),
threeMonthsAway = new Date(now.valueOf()).setUTCMonth(now.getUTCMonth() + 3)) =>
(target > threeMonthsAway)
console.log(isMoreThan3MonthsHence({ utcYear: 2020, utcMonth: 7 })) // true (correct!)
Проблема возникает, когда я пытаюсь создать объект Date
, чтобы использовать его для заполнения аргументов isMoreThan3MonthsHence
.
const validate = (str,
[localMonth, localYear] = str.split('/'),
date = new Date(+localYear, (+localMonth)-1)) =>
isMoreThan3MonthsHence({ utcYear: date.getUTCFullYear(), utcMonth: date.getUTCMonth() })
// Note: input is one-based months
console.log(validate('07/2020')) // false (but should be true!)
Я думаю, причина в том, что при обновлении Date
в validate
без указания часового пояса будет использоваться местный часовой пояс, действующий на предоставленную дату, который будет BST (UTC + 1).
Wed Jul 01 2020 00:00:00 GMT+0100 (British Summer Time)
Это время фактически 23:00 июня 30-го в UT C. Таким образом, месяц на самом деле составляет 5
в терминах нуля. Но я не хочу такого поведения. Я хочу, чтобы указание на июль фактически означало июль в UT C.
Как это можно исправить?