从‘获取当前星期的日期列表‘来看JS日期操作的几种方式

480 阅读2分钟

0. 前言

在日常的开发过程中,日期操作是非常常见,也是经常遇到的需求。在JS中,日期操作也有很多种方式。本篇文章将简单介绍一下常见的几种时间处理的方式,扩展包。并从一个简单的实际应用场景来分别看下,不同的实现方式。

1. 常见方式

1.1 Date对象

文档

Date对象是js自带的处理时间的方法,处理的时间是基于 1970年1月1日UTC零点 (UTC,世界标准时间,挖个坑,以后可以具体讲讲几种时间标准)

使用Date对象来处理时间的好处是不用安装额外的依赖包,但是因为没有一些常用方法的封装,使用上对相对比较麻烦,不是很方便。

要注意的是,使用时要留意Date对象的方法浏览器的支持情况,不同的方法支持情况不同

1.2 MomentJS

MomentJS是非常受欢迎的日期处理包之一。几乎可以完成所有涉及到日期操作的需求,格式化,日期处理,展示等等。而且使用上也非常方便。但是缺点就是,包的大小很大。但是在新版本也做了一些优化,一些不常用的方法作为插件扩展按需进行使用。不带国际化的核心min.js文件18k左右,带国际化的核心min.js文件在73k左右

1.3 DayJS

DayJSMomentJS一样,也是非常受欢迎的日期处理包,我们前面提到,MomentJS的一个弊端就是包大小很大,DayJS就是替代MomentJS的一个轻量化解决方案。项目开发时如果被要求优化项目大小或者页面加载速度,如果发现项目中使用的是MomentJS,我们可以尝试替换成DayJS来进行优化。

2. 获取当前星期的日期范围

以上介绍了,JS中处理日期、时间的三种方式,大家都可以在文档中找到所有的API,一个个讲API或者文档,我认为是没有太大的意义的。我们用一个例子作为抓手,实际来看看他们的使用方式。

image.png

需求: 输出当前日期所在星期的日期列表(星期日为第一天),返回格式为数组,数组中元素格式为YYYY-MM-DD,如图

2.1 Date对象
let current = new Date();
let startDate = current.getDate() - current.getDay();
let res = [];
for(let i = 0;i < 7;i++) {
  let date = new Date(current.setDate(startDate + i))
  let day = date.getDate();
  let month = date.getMonth() + 1;
  let year = date.getFullYear(); 
  res.push(`${year}-${month.toString().padStart(2,'0')}-${day.toString().padStart(2,'0')}`)
}
console.log(res)

// 结果:['2023-06-04', '2023-06-05', '2023-06-06', '2023-06-07', '2023-06-08', '2023-06-09', '2023-06-10']

代码思路是,先获取当前是星期几,然后根据加减天数来得到当前星期的日期,最后格式化添加到结果中。可以看到Date对象处理格式化的时候还是比较费劲的。当然也有其他的思路比如计算秒数加减之类的,大家也可以在评论区畅所欲言。

2.2 MomentJS
let startDate = moment().startOf('week');
let res = [];
for(let i = 0;i < 7;i++) {
  res.push(startDate.format('YYYY-MM-DD'));
  startDate.add(1, 'days');
}
console.log(res)

// 结果:['2023-06-04', '2023-06-05', '2023-06-06', '2023-06-07', '2023-06-08', '2023-06-09', '2023-06-10']

可以看到MomentJS获取日期和格式化日期就方便很多,内置了方法可以直接用,代码也精简很多。

2.3 DayJS
let startDate = dayjs().startOf("week");
let res = [];
for (let i = 0; i < 7; i++) {
    res.push(startDate.format("YYYY-MM-DD"));
    startDate = startDate.add(1, "day");
}
console.log(res);

// 结果:['2023-06-04', '2023-06-05', '2023-06-06', '2023-06-07', '2023-06-08', '2023-06-09', '2023-06-10']

可以看到DayJS和代码和MomentJS的代码几乎一模一样,除了一些细微的差异,比如:

* 初始化日期对象是dayjs,而不是moment
* add方法添加天数用的是day,而不是days
* momentjs 添加天数之后,是在原对象上进行修改,而dayjs不会修改原来的值

3. 总结

我们本篇简单介绍了一下JS中处理日期时间的三种方式,分别是:Date, MomentJS, DayJS。每一种方式都可以实现我们日期操作的一些需求。在日常的开发过程中,可以根据实际情况进行选择

4. 参考资料