在 JavaScript 中获取任何时区中日期字符串的星期几的最佳方法是什么?



我正试图在JavaScript中找到最好的方法来获取任何时区中特定日期的星期几,只给定一个日期字符串。

具体来说,如果我有一个日期字符串,比如:

2022-01-29

我用这个字符串在JS中创建了一个新的Date对象,然后在Date对象上调用getDay方法,因为我在;America/New_York";时区,我实际上得到的是日期前一天的星期几,而不是日期本身的星期几。

这可以很容易地为负UTC时间(例如,美国、加拿大等(的时区中的任何人证明,方法是运行:

new Date('2022-01-29').getDay()

它应该返回周六的6,但由于时区的变化,我得到了周五的5

我发现";https://stackoverflow.com/a/39209842/128421",建议使用getTimezoneOffset方法,如:

var date = new Date('2016-08-25T00:00:00')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() - userTimezoneOffset);

这似乎确实有效,但有几点:

  1. SO文章最后建议使用- userTimezoneOffset,但它只适用于我的+ userTimezoneOffset。为什么
  2. 帖子上的评论说,它不适用于夏令时或所有时区,我不知道如何轻易确认这一点。在我最初的测试中,它似乎适用于夏令时,但也许我遗漏了一些东西,不管怎样,我都不确定如何在其他时区测试它

当我只有一个日期字符串时,用JavaScript获取一周中的哪一天是最好的方法?

使用

new Date('2022-01-29').getUTCDay()

CCD_ 7将创建具有UTC(Greenwhich(日期"的Date对象;2022-01-29";以及时间";00:00h";。当使用.getDay()获取工作日时,您的浏览器会为您的本地时区计算它。通过使用.getUTCDay(),您可以获得UTC时区的工作日。

@RayHatfield 提出的有趣观点

console.log("UTC-time:", new Date("2022-01-29").getUTCHours()) // 0
console.log("UTC-time:", new Date("2022-01-29Z00:00:00").getUTCHours()) // 0 ("Z" is for "ZULU" -> UTC)
console.log("UTC-time:", new Date("2022-01-29T00:00:00Z").getUTCHours()) // 0 (ISO 8601 date string -> UTC)
console.log("UTC-time:", new Date("2022-01-29T00:00:00").getUTCHours()) // UTC time (h) for your local midnight

请参阅https://en.m.wikipedia.org/wiki/ISO_8601有关日期字符串的详细信息。

如果您想获得任何时区中任何日期的工作日名称,可以使用带有适当选项的toLocaleString

由于内置解析器将"2022-01-29"解析为UTC,因此需要将时区设置为UTC。如果需要其他时区的日期名称,只需插入适当的IANA代表位置即可。

// Saturday
console.log(new Date('2022-01-29').toLocaleString('en',{
weekday: 'long',
timeZone: 'UTC'
}));

这样你就不会试图手动调整日期。

OP中的getTimezoneOffset方法也可以工作,即使偏移量发生了变化,例如夏令时或历史变化,但可以简单一点:

let d = new Date('2022-01-29');
d.setMinutes(d.getMinutes() - d.getTimezoneOffset());
console.log(d.getDay()); // 6
console.log(d.toLocaleString('en',{weekday:'long'})); // Saturday

let weekday = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][new Date().getDay()]

相关内容

  • 没有找到相关文章

最新更新