解决elmentui的时间选择器的选定时间与传给后端实际值相差8小时问题

需求场景:

业务是需要根据时间查询数据,并且进入页面,时间选择器默认显示的值是今天凌晨0点到当前这个时间段
前端界面:
在这里插入图片描述

后端参数:
在这里插入图片描述

问题描述

因为是选取时间范围,我前端使用的是两个elmentui的DateTimePicker:
在这里插入图片描述
绑定的参数分别是startTime和endTime。
在这里插入图片描述
如上图所示,定义了两个参数,赋予初始值。理论上这样就行了,但是问题出现了。
在这里插入图片描述
时间选择器显示的时间是对的,但实际传参确是:
在这里插入图片描述
可以很明显看到显示的时间比传参时间多8个小时。
然而当我手动取选择时间时:
在这里插入图片描述
在这里插入图片描述
选择器显示时间和传参时间又是正常对得上的。

原因分析:

通过上面默认和手选操作,观察时间选择器显示和传参时间,可以看到,手动在DateTimePicker选取的时间,传给后端的是GMT格式;而通过上面的代码设置的默认时间传给后端的是UTC格式。GMT和UTC本身就差八小时,典型的时区问题。
通过查阅ElmentUI官方文档,DateTimePicker是可以解析new Date()创建的时间的。从理论上讲,上面设置默认值的代码是合理的。但是却出现了显示和传值不一致问题,具体原因我想是elmentui的bug吧(坐等大佬剖析源码反驳)。
通过调试发现当手动选择时间时,传给绑定值得就是GMT格式。
所以,我们需要传一个GMT时间给绑定值。解决问题的方法就是在设置默认值时,用new Date()创建时间后,还要对时间进行转换,转为GMT格式。

解决方案:

新增一个时间转换方法,代码如下:

fomatTime(date) {
      if (date == "" || !date) {
        return "";
      }
      var _date = new Date(date);
      var y = _date.getFullYear();
      var m = _date.getMonth() + 1;
      m = m < 10 ? ('0' + m) : m;
      var d = _date.getDate();
      d = d < 10 ? ('0' + d) : d;
      var h = _date.getHours();
      h = h < 10 ? ('0' + h) : h;
      var minute = _date.getMinutes();
      minute = minute < 10 ? ('0' + minute) : minute;
      var second = _date.getSeconds();
      second = second < 10 ? ('0' + second) : second;
      return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second ;
    }

在赋予初始值时

    this.startTime = this.fomatTime(this.getTodayBegin())
    this.endTime = this.fomatTime(new Date())

这样传给DateTimePicker的绑定值就是GMT格式的时间,传给后台也就是GMT格式
在这里插入图片描述
另外关于这个八小时时差问题在网上99%的解决方案是加一个value-format="yyyy-MM-dd HH:mm:ss"参数,不知道为什么就是没效果,也许是使用方法的问题。
至此,问题解决。
欢迎指正,补充和讨论!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值