JS 时间加减 / 小时加减

JS 时间加减 / 小时加减

在实际开发中,有时我们需要对Date对象的时间进行加减操作。最常见的一个原因就是数据库采用了GMT时间来存储,而我们查询本地时会默认减去8个小时。在不能改动数据库的情况下,我们只能对Date对象进行加减操作了。

1. 方式一 (参考于百度,原生的有个致命问题,已经改良)

我按照百度上的大佬的逻辑,自己写了一个转换器。这个转换器的实现原理就是先将手动传入的字符串转换成为Date对象,随后用getFullYear()获取年份、getMonth()获取月、getDate()获取日,getHours()获取小时,然后在这个小时上加上8。getMinutes()获取分、getSecondes()获取秒,最后拼起来一个时间格式化的字符串,最后返回一个Date对象。

function converTime (timeString) {
  const time=new Date(timeString);
  timeString=time.getFullYear()+"-"+parseInt(time.getMonth()+1)+"-"+time.getDate()+" "+(time.getHours()+8)+":"+time.getMinutes()+":"+time.getSeconds();
  return new Date(timeString);
}

看起来是有那么一点道理,那我们来实地测试一下。

let timeString = '2021-8-5 17:00:00'
const time = converTime(timeString);
console.log(time);

17 + 8 = 25,而这个function不会自动帮我们处理日期之间的关系。运行一下
在这里插入图片描述

非法日期,那我们来Debug一下,怎么就非法了
在这里插入图片描述

官方上关于构造函数种的小时是这么规定的
在这里插入图片描述
可能有人会说,处理个日期这很难吗?随便来个mod24判断一下不就行了吗?一个 if else 的事。

呃,一个小时间转换小工具,这么做太繁琐了。不太合适。我们有更好的方式。上面这种方式,更适合用来格式化Date数据的样式,不适合用来做时间的加减法操作。

那我们又很好奇,如果我们传入的不是日期字符串(前面的这种方式属于Date.parse(timeString)的方式),而是具体的参数,能不能帮我们处理日期之间的转换呢?也就是说满 24 日期加一,不用我们真的手动去mod24。

改良版
function converTimeV2 (timeString) {
  const time=new Date(timeString);
  return new Date(time.getFullYear(), time.getMonth(), time.getDate(), time.getHours()+8, time.getMinutes(), time.getSeconds());
}

同样的测试代码

let timeString = '2021-8-5 17:00:00'
const time = converTimeV2 (timeString);
console.log(time.toString());

测试结果:可行
在这里插入图片描述

2. 方式二:使用毫秒值计算

先将字符串转换成Date对象,获取它的时间毫秒值加上8个小时,再转换成Date,这时候就是一个加了8个小时后的Date对象了。

function converTime (timeString) {
  return new Date(new Date(timeString).getTime() + 8 * 60 * 60 * 1000);
} 

听不懂没关系,我们来Debug跑一遍你就懂了
在这里插入图片描述

可以看到这种方式也是可以的。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值