![](/img/trans.png)
[英]Is there any way to produce this string date representation (with time-zone) without using javascript substring functions or regex?
[英]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);
这似乎对我现在有用,但有几点:
- userTimezoneOffset
,但它仅适用于我+ userTimezoneOffset
。 那是怎么回事?长话短说,当你只有一个日期字符串时,在 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.