安全(与格式无关)的方式从ISOString中取出.slice()时间子字符串



在ISOString上使用这样的切片从中提取时间是否安全?

new Date().toISOString().slice(11, -8); //08:01

toISOString()方法返回简化扩展 ISO 格式 (ISO 8601( 的字符串,该字符串的长度始终为24 或 27个字符(分别为YYYY-MM-DDTHH:mm:ss.sssZ±YYYYYY-MM-DDTHH:mm:ss.sssZ(。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString

所以,不,该特定代码是不安全的。您需要使用负偏移量以确保两者的安全。

如果您需要它工作,而不管输出字符串中的时间子字符串位置如何,您可以坚持使用:分隔符,使用 RegExp,但是,与slice()split()相比,它可能慢一些:

const [time] = new Date().toISOString().match(/d{1,2}:d{1,2}/g)
console.log(time)

我认为有更安全的选择,因为

toISOString(( 方法返回简化扩展 ISO 格式 (ISO 8601( 的字符串,该字符串的长度分别为
YYYY-MM-DDTHH:mm:ss.sssZ
±YYYYYY-MM-DDTHH:mm:ss.sssZ个字符
(。时区始终为零 UTC 偏移量,后缀"Z"表示。

而toUTCString根据MDN只有一种类型的输出。这可能不正确,如 ecma262 中看到的那样,其中可能有负日期 - 下面的代码应该仍然有效

const t1 = new Date().toISOString().split("T")[1].slice(0, -8); 
const t2 = new Date().toUTCString().split(" ")[4].slice(0, -3); // safer 
const t3 = new Date().toLocaleTimeString("en-GB").slice(0, -3)  // if you want user's time
console.log(t1,t2,t3)
// or as deceze suggested in his comment
const pad = num => ("0"+num).slice(-2);
const d = new Date();
const t4 = `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}`;
console.log(t4)

最新更新