【发布时间】:2020-03-03 16:29:34
【问题描述】:
我正在尝试编写一个函数,该函数将采用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!)
我认为原因是在 validate 中新建 Date 而不指定时区将使用在提供的日期有效的本地时区,即 BST (UTC+1)。
Wed Jul 01 2020 00:00:00 GMT+0100 (British Summer Time)
这个时间实际上是世界标准时间 6 月 30 日 2300 小时。所以月份实际上是从零开始的5。但我不想要这种行为。我希望它指定 7 月实际上意味着 UTC 中的 7 月。
我该如何解决这个问题?
【问题讨论】:
-
可能是因为
Date.UTC()将您的参数视为 UTC,而new Date()将它们视为本地 (UTC+1),一旦您调用getUTCMonth(),您确实比 UTC 早了一个小时观点(然后仍然在上个月)。为什么不在两者中都使用Date.UTC()? -
做
new Date(2020, 6).toUTCString()- 即查看整个日期,而不仅仅是月份和年份 - 你会清楚地看到原因。是的,这确实与您在 7 月进入 BST 的事实有关。
标签: javascript date