自动摘要
正在生成中……
今天发现一个奇怪的问题,在iPhone使用 safari 选择定时发布文章到OSC,选择时间后提示不是合法的时间,判断时间的代码如下:
var d = new Date('2020-01-23 23:15');
if (isNaN(d)) {
console.log('isNaN');
}else{
console.log('pass');
}
在Chrome下会输出 pass
,在Safari会输出 isNaN
,根据 ECMAScript 5 ISO-8601 format support: 的说法
Alternatively, the date/time string may be in ISO 8601 format. For example, "2011-10-10" (just date) or "2011-10-10T14:48:00" (date and time) can be passed and parsed.
关于时间和日期字符的格式,有两种可能的方式,一种是 '2020-01-23 23:15'
,另一种是 '2020-01-23T23:15'
, 但 Safari 只支持后者,而Chrome则两种都支持,所以只要写成下面的方式,中间加入一个 T 就可以了。
new Date('2014-02-18T15:00:48')
转换的方式也很简单:
new Date('2014-02-18T15:00:48'.replace(/\s/, 'T'))
更新:转换后可能会出现新的问题( 2020/02/02 updated )
如果你之前允许2020-01-23 1:15
这样的日期合法,转换后会变成 2020-01-23T1:15
,将返回为无效日期。
如原来在chrome下
var d = new Date('2020-01-23 1:15');
if (isNaN(d)) {
console.log('isNaN');
}else{
console.log('pass');
}
会返回pass
但修改后
var d = new Date('2020-01-23 1:15'.replace(/\s/,'T') );
if (isNaN(d)) {
console.log('isNaN');
}else{
console.log('pass');
}
会返回isNaN
,无效的日期
因此需要在转换前对 月/日/时/分
做一次不足两位时的加前置0的转换,转换函数如下:
function prefixInteger(num, length) {
return (Array(length).join('0') + num).slice(-length);
}
如对小时进行转换: hour = prefixInteger(hour,2)