【js】getTime的坑!!!

new Date(‘指定日期’).getTime()时间转换不相等?!!

起源

该问题发现于日期组件增加国家法定假节假日的禁用,通过pickerOptions属性定义disabledDate方法实现

export default {
  data () {
    return {
      holidayList: [
        '2023-01-01',
        '2023-01-02',
        '2023-01-21',
        '2023-01-22',
        '2023-01-23',
        '2023-01-24',
        '2023-01-25',
        '2023-01-26',
        '2023-01-27',
        '2023-04-05',
        '2023-04-29',
        '2023-04-30',
        '2023-05-01',
        '2023-05-02',
        '2023-05-03',
        '2023-06-22',
        '2023-06-23',
        '2023-06-24',
        '2023-09-29',
        '2023-09-30',
        '2023-10-01',
        '2023-10-02',
        '2023-10-03',
        '2023-10-04',
        '2023-10-05',
        '2023-10-06'
      ],
      pickerOptions: this.handle(),
      value: ''
    }
  },
  methods: {
    handle () {
      const that = this
      return {
        disabledDate (time) {
          console.log(new Date(time), '666')
          if (time==法定节假日) {
            return true
          } else {
            return time.getTime() < Date.now() - 8.64e7
          }
        }
      }
    }
  }
}

原因

在disabledDate 中打印获得时间全部是使用的零时区时间,并且通.toLocaleString()转换之后的时间格式为yyyy/MM/dd 为 RFC 2822 日期格式标准

在这里插入图片描述

而我们一般时间格式化使用国际标准ISO 8601规范日期格式为

YYYY-MM-DDThh:mm:ss[.mmm]TZD

东八区,也就是GMT+8,并且.toLocaleString()转换之后的时间格式为yyyy-MM-dd
在这里插入图片描述
两者之间的差别

  • 当在不指定时区的情况下,RFC 2822 写法会使用 UTC 时间来解析,而ISO 8601写法则当作本地时区处理
  • RFC2822 相对来说写法更加宽松,甚至可以兼容 Mon, 06 Mar 2017 21:22:23 +0000 这样的写法
  • RFC2822 的时区表示用四位数字(+0800),而 ISO 8601 的时区表示用 HH:MM (+08:00)

在这里插入图片描述

所以此时我们通过disabledDate 中的 yyyy/MM/dd格式时间与yyyy-MM-dd格式时间具有8小时的时间差

解决

统一时间到00:00:00

methods: {
    handle () {
      const that = this
      return {
        disabledDate (time) {
          if (that.holidayList.find(d => time.getTime() === new Date(d + ' 00:00:00').getTime())) {
            return true
          } else {
            return time.getTime() < Date.now() - 8.64e7
          }
        }
      }
    }
  }

谁能想到 不同格式化的string日期转Date还有这种操作

参考:前端国际化时间日期概述与业务实践

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麻辣翅尖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值