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跑一遍你就懂了
可以看到这种方式也是可以的。