无论用户的时区如何,如何从日期字符串中获取日期名称?

How to get the day name from the date string regardless of user's timezone?

给定一个日期(没有时间),例如2021-08-11,无论用户的时区如何,我如何获得它的日期名称(例如星期三)?

注意尝试使用:

new Date("2021-08-11").toLocaleString('en-AU', { weekday:'long' })

date-fnsformat:

format(new Date("2021-08-11"), "EEEE")

例如,如果用户的时区是 GMT-7,则会得出错误的日期(星期二)。

我还没有调查过最新的data-fns。但是几年前我使用它时,它没有时区支持。由于Date class 内部没有保留时区信息,所以当时间获取的位置与使用的位置不同时会导致一些问题。有关详细信息,请参阅此 Whosebug post

有一些库可以解决这个问题。由于您使用的是 date-fns,您可能想尝试 date-fns-tz.

您可以按照其他评论的建议使用 date-fns-tz。它内部使用 Intl。如果你只关心得到一天,你可以直接使用 Intl:

let formatter = new Intl.DateTimeFormat('en-US', {
  timeZone: 'UTC',
  weekday: 'long',
});

formatter.format(new Date("2021-08-11")) // outputs: "Wednesday"

我建议您也将日期格式化为 ISO,即 "2021-08-11T00:00:00.000Z",因为末尾的 Z 将确保在格式化之前以 UTC 格式解析日期。