new Date()在ios中的那些坑

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) + "分钟"
},

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用提到,iOS系统对于JavaScriptnew Date()方法有格式要求。在小程序开发,苹果手机无法正常处理带有"-"格式的日期字符串,只能处理带有"/"格式的日期字符串。所以在使用new Date()方法时,需要将日期字符串的"-"替换为"/"才能在iOS上正常转换成日期对象。 引用提供了解决办法,可以使用字符串的replace()方法将日期字符串的"-"替换为"/"来解决兼容性问题。具体代码如下: ``` let dateStr = '2022-12-12'; let date = new Date(dateStr.replace(/-/g, '/')); // 将"-"替换为"/",得到兼容iOS的日期对象 ``` 这样,无论是在Android还是iOS上,都可以正常使用new Date()方法来转换日期字符串了。 引用也提到了同样的问题,即在小程序使用new Date()方法时,iOS手机需要将日期字符串的"-"替换为"/"才能正常工作。解决办法也是使用字符串的replace()方法来进行替换。 综上所述,当在微信小程序使用new Date()方法时,需要注意iOS系统对日期格式的要求,如果日期字符串包含"-",则需要将其替换为"/"才能得到正确的日期对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [微信小程序new Date()方法失效问题解决方法](https://download.csdn.net/download/weixin_38637918/14014583)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [微信小程序 IOSnew Date()时间格式不兼容问题](https://blog.csdn.net/hhkongbai/article/details/127982842)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [微信小程序使用new Date(time)转格式的问题](https://blog.csdn.net/qq_38004125/article/details/123575298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值