使用toLocaleDateString时获得不同日期的原因是什么?

问题描述

当找到对象数组中存在的节日时,并尝试使用toLocaleDateString打印用户友好消息时,我得到的节日日期比执行toLocaleDateString时少了一天

请看下面的例子

const date = "12/25/2020";
const [month,day,year] = date.split("/");
const newDate = `${year}-${month}-${day}`;
const holidays = [
  { celebration: "New year",date: "2020-12-31" },{ celebration: "Christmas",date: "2020-12-25" },{ celebration: "...",date: "2020-12-24" },];
const holiday = holidays.find((holiday) => holiday.date === newDate);

if (holiday) {
  const { celebration,date } = holiday;
  const options = {
    month: "long",day: "2-digit",};
  const localDate = new Date(date).toLocaleDateString("en-US",options);
  const message = `Date ${date} coincides with the holiday ${celebration} in date ${localDate}. Do you want to continue?`;

  console.log(message);
}

我得到Date 2020-12-25 coincides with the holiday Christmas in date December 24. Do you want to continue?

我希望Date 2020-12-25 coincides with the holiday Christmas in date December 25. Do you want to continue?

这是一个微妙的细节,但我得到的是24而不是25

解决方法

最有可能是由于时区。我认为您居住在美洲。

当您使用Date(string)创建日期时,它会使用UTC创建日期,但是当您显示日期时,它会显示您自己的时区中的日期,因此UTC / GMT以西的任何日期都将显示2020-12 -25T00:00Z发生在2020-12-24。

此外,使用Date进行的解析因实现而异,因此通常建议使用Moment.js之类的库进行解析(并且还可以正确处理时区)。