苹果系统中js获取java传回的Date对象字符串显示Nan的解决方案之一

原创
2020/06/04 09:49
阅读数 147

事件起因:同事说他手机(ios)登入后台管理系统时日期显示不出来,电脑(windows)上没问题。

解决过程:

经过一顿搜索,发现苹果的系统都不支持yyyy-MM-dd这样中间是横杠(-)的日期???据说改成斜杠(/)就没问题了???但直接把网上的代码抄过来还是有问题,ios能显示了但显示的日期是UTC日期(╯‵□′)╯︵┻━┻

比如:java返回给js的Date对象字符串是“ 2020-06-10T01:29:25.000+0000 ”,经过网上查到的代码变换成“ 2020/06/10 01:29:25”(即横杠变斜杠,中间T变成空格,去掉小数点及其后面的字符串)后ios能够显示,但显示的日期也是1:29:25,本地没有加8小时,是因为也去掉了时间字符串后面的“.000+0000”,但是不去掉的话在苹果系统的浏览器new Date("2020/06/10 01:29:25.000+0000")是会报错的!所以要换个方式表示它需要对应的时区,我是采用在后面加入" GMT"来解决,即最后转换出的字符串是“2020/06/10 01:29:25 GMT”,这在windows和ios中都能够生成,可以,这很完美(斜眼笑)。

最终代码:

由于我使用的框架是vue,所以可以在过滤器中加入下面这段代码,在项目中遇到需要转换格式的时候直接“createTime | formatDate”来格式化日期。这段代码是我在网上找的再稍加修改后得出的,可参考下=v=

(如果不是用vue,那也可以直接把function部分拷贝出来做个通用函数)

Vue.filter('formatDate', function (date) {
  if (date == null || date == '' || date == 'undefined') {
    return ''
  }
  date = date + ''
  date = date.replace(/\-/g, '/')
  if (date.indexOf('GMT') == -1) {
    date = date.replace(/\T/g, ' ')
  }
  let flag = false
  if (date.indexOf('.') != -1) {
    flag = true
    date = date.substr(0, date.indexOf('.'))
  }
  if (flag) {
    date += ' GMT'
  }
  date = new Date(date)
  let fmt = 'yyyy-MM-dd hh:mm:ss'
  var o = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'h+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    'S': date.getMilliseconds() // 毫秒
  }
  if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) }
  for (var k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) }
  }
  return fmt
})
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部