繁体   English   中英

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

[英]What's the best way in JavaScript to get the day of the week of a date string in any time zone?

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

具体来说,如果我有如下日期字符串:

2022-01-29

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

通过运行以下命令,可以轻松地为处于负 UTC 时间的时区(例如,美国、加拿大等)的任何人演示:

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

您应该在周六获得6 ,但由于时区偏移,您在周五获得5

我发现了另一个建议使用getTimezoneOffset方法的 SO 帖子( Parse date without timezone javascript ),如下所示:

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

这似乎对我现在有用,但有几点:

  1. SO帖子建议最后使用- userTimezoneOffset ,但它仅适用于我+ userTimezoneOffset 那是怎么回事?
  2. 该帖子的评论说它不适用于夏令时或所有时区,我不确定如何轻松确认。 在我最初的测试中,它似乎适用于夏令时,但也许我缺少一些东西,无论哪种方式,我都不确定如何在其他时区测试它。

长话短说,当你只有一个日期字符串时,在 JS 中获取星期几的最佳方法是什么? 谢谢你。

利用

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

new Date('2022-01-29')将创建一个日期 object,UTC (Greenwhich) 日期为“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:00").getUTCHours()) // UTC time (h) for your local midnight

如果要获取任何时区中任何日期的工作日名称,可以使用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()]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM