iOS设备日期比较异常:iPhone端日期判断弹窗错误
解决iPhone上日期比较功能的错误问题
嘿,我一眼就看出问题所在了——iPhone上的Safari浏览器对日期字符串的解析规则比其他浏览器严格很多!你代码里用的yyyy-mm-dd hh:mm:ss这种空格分隔的格式,在iOS的Safari里会被解析成无效日期,导致getTime()返回NaN,自然就会触发错误的提示逻辑了。
两种靠谱的修复方案
我给你准备了两种修复方式,都能完美解决兼容性问题:
方案一:转成ISO 8601标准格式
把日期字符串里的空格替换成T,变成yyyy-mm-ddThh:mm:ss这种所有浏览器都支持的ISO标准格式:
function play_time() { var today = new Date(); // 用padStart简化补零逻辑,替代原来的if判断 const year = today.getFullYear(); const month = String(today.getMonth() + 1).padStart(2, '0'); const day = String(today.getDate()).padStart(2, '0'); const hours = String(today.getHours()).padStart(2, '0'); const minutes = String(today.getMinutes()).padStart(2, '0'); const seconds = String(today.getSeconds()).padStart(2, '0'); // 构造ISO格式的当前日期时间 const crntDatetime = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`; const crntTime = new Date(crntDatetime).getTime(); // 把目标时间的空格替换成T const check = '2020-08-18 23:14:07'.replace(' ', 'T'); const gameTime = new Date(check).getTime(); if (crntTime <= gameTime) { alert('Play'); } else { alert('Later'); } }
<button onClick="play_time();"> show Time </button>
方案二:直接用Date构造参数创建对象(更推荐)
完全避开字符串解析的坑,直接用年、月、日、时、分、秒作为参数构造Date对象(注意:Date的月份参数是0-11,所以8月要传7):
function play_time() { const today = new Date(); const crntTime = today.getTime(); // 直接传入年、月(减1)、日、时、分、秒 const gameTime = new Date(2020, 7, 18, 23, 14, 7).getTime(); if (crntTime <= gameTime) { alert('Play'); } else { alert('Later'); } }
<button onClick="play_time();"> show Time </button>
小提示
String().padStart(2, '0')是ES6+的方法,能帮你快速给单个数字的日期/时间补零,比原来的if判断简洁多啦。如果需要兼容极旧的浏览器,也可以保留原来的if补零逻辑~
内容的提问来源于stack exchange,提问作者lipon
相关产品推荐
相关产品推荐

