如何在JavaScript中将已为UTC的日期字符串强制转为UTC格式?
解决UTC日期字符串强制转为UTC Date对象的问题
问题原因
你用new Date(raw_time)解析2022-07-01 00:00:03时,JS引擎会把这个**不带时区标识的字符串默认按本地时区(英国BST,GMT+1)**解析。所以本地时间的2022-07-01 00:00:03,对应的UTC时间就是前一天的23:00:03,这才导致toUTCString()输出不符合预期。
两种可行解法
方法1:给原始字符串添加UTC时区标识
直接在原始时间字符串末尾加上Z(表示UTC时区),同时把空格换成T(符合ISO 8601标准格式),这样JS会明确按UTC解析:
const raw_time = "2022-07-01 00:00:03"; // 转换为ISO 8601 UTC格式 const utc_time_str = raw_time.replace(" ", "T") + "Z"; const my_time = new Date(utc_time_str); console.log(my_time.toUTCString()); // 输出:Fri, 01 Jul 2022 00:00:03 GMT
方法2:用Date.UTC()手动构建UTC时间
拆分原始字符串的年、月、日、时、分、秒,通过Date.UTC()生成UTC时间戳,再转为Date对象。注意JS的月份是从0开始计数的,所以要减1:
const raw_time = "2022-07-01 00:00:03"; // 拆分时间各部分 const [datePart, timePart] = raw_time.split(" "); const [year, month, day] = datePart.split("-").map(Number); const [hour, minute, second] = timePart.split(":").map(Number); // 用Date.UTC构建UTC时间,月份减1 const my_time = new Date(Date.UTC(year, month - 1, day, hour, minute, second)); console.log(my_time.toUTCString()); // 输出:Fri, 01 Jul 2022 00:00:03 GMT
验证时间范围判断
用上述任意一种方法得到正确的UTC Date对象后,就可以正常和目标时间范围做比较了,直接用Date对象的大小判断即可:
const start = new Date("Fri, 01 Jul 2022 00:00:00 GMT"); const end = new Date("Sun, 31 Jul 2022 23:59:59 GMT"); const isInRange = my_time >= start && my_time <= end; console.log(isInRange); // 输出true
内容的提问来源于stack exchange,提问作者Psionman
相关产品推荐
相关产品推荐

