new Date()在ios中的那些坑

最近在做一个公众号的考勤请假功能,需在选完请假开始时间、结束时间后计算出请假时长,于是封装了一个计算时间差的公共方法

下面是我最开始的代码,本以为直接拿到这两个时间戳比较计算出结果就可以了,没想到踩到了坑。。。

//计算两个时间差
utils.getDuration = (start, end) => {
  let startTime = new Date(start).getTime()
  let endTime = new Date(end).getTime()
  let usedTime = endTime - startTime;  //两个时间戳相差的毫秒数
  let days = Math.floor(usedTime/(24*3600*1000))
  let leave1 = usedTime % (24 * 3600 * 1000);// 获取毫秒数
  let hours = Math.floor(leave1 / (3600 * 1000));// 获取小时数
  let leave2 = leave1 % (3600 * 1000);// 排除小时的毫秒数
  let minutes = Math.floor(leave2 / (60 * 1000));// 获取分钟
  return days + '天' + (hours > 9 ? hours : "0" + hours) + "小时" + (minutes > 9 ? minutes : "0" + minutes) + "分钟"
},

在手机模拟器中亲测确实没有问题,发布以后,在Android手机上亲测也没有问题,然而。。。在ios真机上出现问题了,显示NaN

问题出现了,就得找原因啊,最后发现是因为new Date()在ios上是有格式要求的,目前年月日只支持xxxx/xx/xx格式,而上述代码中拿到的start、end格式都是被我转化成以‘-’分割的格式,原因找到了就好办啦,既然必须是‘/’分割,那就把‘-’替换一下呗,下面是修改后的代码,采用正则表达式将 ‘/’ 替换成 ‘-’

//计算两个时间差
utils.getDuration = (start, end) => {
  let startDate = start.replace(/\-/g,"/")
  let endDate = end.replace(/\-/g,"/")
  let startTime = new Date(startDate).getTime()
  let endTime = new Date(endDate).getTime()
  let usedTime = endTime - startTime;  //两个时间戳相差的毫秒数
  let days = Math.floor(usedTime/(24*3600*1000))
  let leave1 = usedTime % (24 * 3600 * 1000);// 获取毫秒数
  let hours = Math.floor(leave1 / (3600 * 1000));// 获取小时数
  let leave2 = leave1 % (3600 * 1000);// 排除小时的毫秒数
  let minutes = Math.floor(leave2 / (60 * 1000));// 获取分钟
  return days + '天' + (hours > 9 ? hours : "0" + hours) + "小时" + (minutes > 9 ? minutes : "0" + minutes) + "分钟"
},

相信很多人都踩过这个坑,下次注意点吧。。。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐