我正试图在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);
这似乎确实有效,但有几点:
- SO文章最后建议使用
- userTimezoneOffset
,但它只适用于我的+ userTimezoneOffset
。为什么 - 帖子上的评论说,它不适用于夏令时或所有时区,我不知道如何轻易确认这一点。在我最初的测试中,它似乎适用于夏令时,但也许我遗漏了一些东西,不管怎样,我都不确定如何在其他时区测试它
当我只有一个日期字符串时,用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()]