事件起因:同事说他手机(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
})