提升日期处理效率:day.js 实战经验分享

news2024/11/24 19:06:02

theme: smartblue

本文简介

点赞 + 关注 + 收藏 = 学会了

  1. 本文主要介绍我在工作中使用 day.js 较多的方法。

  2. 本文并不能代替 day.js 官方文档,日常工作中该查文档的还是要查文档。

  3. 本文是写给刚接触 day.js 的工友,让这部分工友能更顺利上手 day.js

  4. 本文不涉及 day.js 插件(王国之泪通关后再写这部分吧)。

day.js 简介

day.js 是一个专门处理日期和时间的工具库,它的体积只有 2KB,非常小。

安装 day.js

npm

安装

npm install dayjs --save

使用

```js // 引入 dayjs import dayjs from 'dayjs'

// 输出当前时间 console.log(dayjs()) ```

cdn

访问 https://www.jsdelivr.com/package/npm/dayjs 下载最新版本的 Day.js。

```html

```

格式化日期格式

前面我们使用 dayjs() 获取到当前的时间,但返回的格式不好看。

01.png

js // 输出当前时间 console.log(dayjs())

day.js 提供了 format() 方法可以格式化时间。《文档:Format》

format() 会返回一个字符串类型的时间。

基础用法

02.png

js // 格式化当前时间 console.log(dayjs().format())

自定义格式

format() 支持自定义日期格式,点击查看支持的格式

常用格式我拷一份放在这里

| 占位符 | 输出 | 详情 | | ------ | ---------------- | --------------- | | YY | 18 | 两位数的年份 | | YYYY | 2018 | 四位数的年份 | | M | 1-12 | 月份,从 1 开始 | | MM | 01-12 | 月份,两位数 | | MMM | Jan-Dec | 缩写的月份名称 | | MMMM | January-December | 完整的月份名称 | | D | 1-31 | 月份里的一天 | | DD | 01-31 | 月份里的一天,两位数 | | d | 0-6 | 一周中的一天,星期天是 0 | | dd | Su-Sa | 最简写的星期几 | | ddd | Sun-Sat | 简写的星期几 | | dddd | Sunday-Saturday | 星期几 | | H | 0-23 | 小时 | | HH | 00-23 | 小时,两位数 | | h | 1-12 | 小时, 12 小时制 | | hh | 01-12 | 小时, 12 小时制, 两位数 | | m | 0-59 | 分钟 | | mm | 00-59 | 分钟,两位数 | | s | 0-59 | 秒 | | ss | 00-59 | 秒 两位数 | | SSS | 000-999 | 毫秒 三位数 | | Z | +05:00 | UTC 的偏移量,±HH:mm | | ZZ | +0500 | UTC 的偏移量,±HHmm | | A | AM PM | | | a | am pm | |

知道这些格式,我们就可以这样写:

```js // 年 dayjs().format('YY') // 返回 23 (写本文时是2023年) dayjs().format('YY') // 返回 2023

// 月 dayjs().format('M') // 返回当前月份(1-12) dayjs().format('MM') // 返回当前月份(01-12),用MM的话,1-9月前面会补0

// 日 dayjs().format('D') // 返回当前月份里的天,比如今天是5月1号,就输出1;如果今天是5月20号,就输出20 dayjs().format('DD') // 返回当前月份里的天,用DD的话,1-9天前面会补0

// 星期 dayjs().format('d') // 返回一周中的一天,星期天是 0

// 小时 dayjs().format('H') // 返回小时 0-23 dayjs().format('HH') // 返回小时 00-23,0-9小时前面会补0 dayjs().format('h') // 返回小时 1-12 dayjs().format('hh') // 返回小时 01-12,1-9小时前面会补0

// 分钟 dayjs().format('m') // 返回分钟 0-59 dayjs().format('mm') // 返回分钟 00-59,0-9分钟前面会补0

// 秒 dayjs().format('s') // 返回秒 0-59 dayjs().format('ss') // 返回秒 00-59,0-9秒前面会补0 dayjs().format('sss') // 返回毫秒数 000-999 ```

需要注意:

  • 大写M表示月份,小写m表示分钟。
  • 大写D表示月份里的一天,小写d表示一周中的一天
  • 大写H是24小时制,小写h是12小时制。比如下午2点 大写H是14,小写h就是2。如果是使用小写h,建议配合A或者a一起使用。

可以将上面的格式组合起来使用

```js /* 目标:输出当前年月日时分秒 规则:年月日用“-”分隔;时分秒用“:“分隔;年月日和时分秒之间用空格分隔 */ dayjs().format('YYYY-MM-DD hh:mm:ss')

/* 目标:输出当前年月日 规则:年月日用“/”分隔 */ dayjs().format('YYYY/MM/DD')

/* 目标:输出当前年月日 规则:使用中文的“年”、“月”、“日”单位 */ dayjs().format('YYYY年MM月DD日') ```

dayjs() 还接受传入时间参数,然后再使用 format() 进行格式化

js dayjs('2023-05-20').format('YYYY年MM月DD日') // 返回 2023年05月20日

简单吧,好用吧~

format() 和其他方法结合起来很好用,后面会举例。

获取/设置日期时间

前面的例子中我们通过 dayjs().format('M') 等方法可以获取当前时间或者指定时间的月份等信息。

day.js 其实也提供了一些方法可以获取或者设置指定日期时间,详情可以看 文档。

我这里举个例子。

```js // 获取当前月份。注意:月份从0开始,0表示1月,1表示2月... dayjs().month()

// 设置月份 dayjs().month(10)

// 设置完月份后格式化 dayjs().month(10).format() ```

这个例子用到 month() 方法,如果不传参就会返回当前日期的月份,如果传了参就变成设置月份了。

还有年、日、周、时分秒等其他配置和获取的方法,请参考 文档。

日期时间计算

日期计算是工作中常用的功能,比如计算3天后的日期是多少。day.js 提供了很多方便的方法。

增加日期时间

给定一个日期,希望获取该日期的后几天,或者想获取当前时间的半小时后的时间,就可以使用 add() 方法。

add() 方法接收2个参数:

  • 第一个参数是要增加的时间,可以是负值。
  • 第二个参数是时间单位,比如 daymonth 等。

第二个参数支持的单位如下:

| 单位 | 缩写 | 详情 | | ------------- | ---- | -- | | day | d | 日 | | week | w | 周 | | month | M | 月 | | year | y | 年 | | hour | h | 小时 | | minute | m | 分钟 | | second | s | 秒 | | millisecond | ms | 毫秒 |

其实第二个参数还支持 quarter 查询季度,但需要安装 QuarterOfYear 插件。

比如获取当前日期的后10天。

```js dayjs().add(10, 'day')

// 格式化后返回 dayjs().add(10, 'day').format() ```

如果加了10天后夸了月,day.js 会自动判断的。

比如今天是2023年5月24日,加了10天就是2023年6月3日。

获取当前时间的半小时后的时间。

```js dayjs().add(30, 'minute')

// 或者 dayjs().add(0.5, 'hour') ```

如果传入的值是负数,那返回的时间就是往前计算的。

比如获取10天前的时间。

js dayjs().add(-10, 'day')

使用 add() 方法第一个参数最好还是传入正数,因为想获取之前的时间,可以使用 subtract() 方法。

减少日期时间

subtract() 方法和 add() 的用法一样。

subtract() 的作用是返回减去一定时间的值。

比如想获取10天前的时间值可以这样写。

js dayjs().subtract(10, 'day')

subtract() 的第一个参数同样可以传入负数,但没必要这么做。

subtract() 方法很适合用在日历组件的快捷选项,比如获取1周内的时间。

```js // 当前时间 dayjs().format('YYYY-MM-DD hh:mm:ss')

// 7天前的时间 dayjs().subtract(7, 'day').format('YYYY-MM-DD hh:mm:ss') ```

获取开始日期时间

使用 startOf() 方法可以获取开始时间日期。

startOf() 需要传入一个单位参数,这个参数支持以下值:

| 单位 | 缩写 | 详情 | | -------- | --- | ------------------------- | | year | y | 今年一月1日上午 00:00 | | month | M | 本月1日上午 00:00 | | week | w | 本周的第一天上午 00:00 (取决于国际化设置) | | date | D | 当天 00:00 | | day | d | 当天 00:00 | | hour | h | 当前时间,0 分、0 秒、0 毫秒 | | minute | m | 当前时间,0 秒、0 毫秒 | | second | s | 当前时间,0 毫秒 |

其中 quarter 需要另外安装 QuarterOfYear 插件,isoWeek 需要另外安装 IsoWeek 插件。

比如,我要获取当月的1号到今天的日期。

```js // 今天的日期 dayjs().format()

// 本月的第一天日期 dayjs().startOf('month').format() ```

我在项目中,图表部分有时候会有这种需求。

再比如,有些时候我们可能想获取当前时间的本周第一天,比如今天是2023年5月25号星期4,我想看看这周的周一是几号,就可以这么写:

js dayjs().startOf('week').format('DD') // 返回 21。2023年5月21号是星期1

获取结束日期时间

有获取开始日期时间就有获取结束日期时间。

day.js 提供了 endOf() 方法获取结束日期时间。

比如要获取当前日期的 23:59:59

dayjs().endOf('day').format()

endOf() 通常会和 startOf() 结合使用,这样就可以获取一个比较完整的时间段。

比如要获取 2020年2月的开始和结束日期。

// 2020年2月开始日期时间
dayjs('2020-02').startOf('month').format()

// 2020年2月结束日期时间
dayjs('2020-02').endOf('month').format()

像2月这种不能一眼看出有多少天的月份,用 endOf() 方法就非常方便了。

计算2个日期时间差

如果要计算2个日期时间的差异,可以使用 diff() 方法。

diff() 的语法:

```js 时间1.diff(时间2)

时间1.diff(时间2, 时间单位) ```

如果不传第二个参数(时间单位),默认返回毫秒数。

举个例子,计算北京奥运会开幕式到现在过了多少天。

```js // 北京奥运会开幕时间 const openingDate = dayjs('2008-08-08')

// 当前时间 const now = dayjs()

// 计算北京奥运开幕式到现在过了多少毫秒 now.diff(openingDate)

// 计算北京奥运开幕式到现在过了多少天 now.diff(openingDate, 'day') ```

单位时间除了 'day' 之外,还支持以下单位:

| 单位 | 缩写 | 详情 | | ------------- | ---- | ----------------- | | day | d | 日 | | week | w | Week of Year | | quarter | Q | Quarter | | month | M | 月份 (一月 0, 十二月 11) | | year | y | Year | | hour | h | Hour | | minute | m | Minute | | second | s | Second | | millisecond | ms | Millisecond |

日期时间查询

查询指定月份有多少天

我还记得小学数学老师教我们数一个月有多少天的方法。

举起一个拳头👊

03.png

不好意思,搞错了。。。

04.jpg

从食指往小拇指方向数,凸起来的是31天,凹下去的是30天,2月份除外。

因为有闰年的存在,2月的天数是不定的。

day.js 提供了 daysInMonth() 方法可以快速查询指定月份有多少天。

```js dayjs('2008-02').daysInMonth() // 返回29

dayjs('2023-02').daysInMonth() // 返回28 ```

查询时间是否在另一个时间之前

查询一个时间是否在另一个时间之前,用的是 isBefore() 方法。

比如查询当前日期是否在北京奥运会开幕式之前

js dayjs().isBefore(dayjs('2008-08-08'))

isBefore() 接受第二个参数:时间单位。

比如传入 month,就通过年和月来对比。

js ayjs().isBefore(dayjs('2008-08-08'), 'month')

查询时间是否在另一个时间之后

查询一个时间是否在另一个时间之后,用的是 isBefore() 方法。

比如查询当前日期是否在北京奥运会开幕式之后

js dayjs().isAfter(dayjs('2008-08-08'))

isAfter() 也支持传入第二个参数:时间单位。

判断两个时间是否相同

判断两个时间是否相同使用的方法是 isSame()

isSame() 方法默认使用毫秒来判断。

js dayjs().isSame(dayjs('2008-08-08'))

如果想判断年份或者月份是否相同,就需要传入第二个参数:时间单位。

```js // 年份相同就返回 true,否则返回 false dayjs().isSame('2008-08-08', 'year')

// 年份和月份相同才返回 true,否则返回 false dayjs().isSame('2008-08-08', 'month')

// 年月日都相同才返回 true,否则返回 false dayjs().isSame('2008-08-08', 'day') ```

是否在其他两个的日期时间之间

判断一个时间是否在某个时间段内,需要用到 IsBetween 插件。

如果不想下载这个插件,完全可以通过 isBefore()isAfter() 组合起来进行判断。

比如判断当前时间是否在 2019年 至 2025年 之间,可以这么写:

```js // 当前时间 const now = dayjs()

// 判断结果 now.isAfter('2019') && now.isBefore('2025') ```

推荐阅读

👍《眨个眼就学会了Pixi.js》

👍《P5.js 光速入门》

👍《Fabric.js从入门到膨胀》

👍《前端新宠 Svelte 带来哪些新思想?赶紧学起来!》

👍《物理世界的互动之旅:Matter.js入门指南》

点赞 + 关注 + 收藏 = 学会了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SMESwin Unet:融合CNN和Transformer进行医学图像分割

文章目录 SMESwin Unet: Merging CNN and Transformer for Medical Image Segmentation摘要本文方法SuperpixelMCCT SMESwin Unet: Merging CNN and Transformer for Medical Image Segmentation 摘要 视觉Transformer 是自去年以来医学图像分割领域最受欢迎的新范式&#xf…

ts报错“this“ 隐式具有类型 “any“,因为它没有类型注释。解决方案

序 1、参考博文》①严格模式 - 知乎,②ts的tsconfig.son中文说明③TypeScript Number | 菜鸟教程 2、解决(ts报错“this“ 隐式具有类型 “any“,因为它没有类型注释。) 3、解决(函数内this是undefined 的问题&#xf…

汽车EDI:如何与Stellantis建立EDI连接?

Stellantis 是一家实力雄厚的汽车制造公司,由法国标致雪铁龙集团(PSA集团)和意大利菲亚特克莱斯勒汽车集团(FCA集团)合并而成,是世界上第四大汽车制造商,拥有包括标致、雪铁龙、菲亚特、克莱斯勒…

Hive学习---1、Hive入门、Hive 安装

1、Hive入门 1.1 什么是Hive 1、Hive简介 Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 2、Hive本质 Hive是一个Hadoop客户端,用于将HQL(Hive SQL…

【六一为孩子建模吧】沐风老师3DMAX建模雕刻插件SculptTool使用教程

3DMAX建模雕刻插件,该工具旨在使对角色和地形等有机模型进行小型编辑成为可能,而无需离开3dMax并启动如ZBrush等专用雕刻应用程序,就可以在3DMAX中直接对小型模型进行简单的雕刻建模处理,这样会方便很多。 【适用版本】 3dMax202…

【C++初阶】:string类

string 一string的基本用法二.迭代器1.基本使用2.语法糖3.反向迭代器4.const迭代器 三.容量四.插入和删除五.一个例题:解析协议六.读取空格七.一些其他函数 一string的基本用法 文档里 一般使用 二.迭代器 1.基本使用 string里重载了一种非常厉害的运算符[ ] 这个运…

【web安全】文件包含漏洞

目录 1.什么是文件包含漏洞 2.产生原因 3.文件包含的类型 3.1本地文件包含 3.2远程文件包含 4.攻击利用手法 4.1 file:协议 4.2 php://协议 ​4.3 zip://,bzip2://,zlib://协议 4.4 data://协议 4.5 PHP伪协议总结 5.如何防御? 6.常见系统的默认路径…

Tcl-11. 列表操作

Tcl 中的列表操作: 列表则是具有特殊解释的字符串。Tcl 中的列表操作和其它 Tcl 命令 一样具有相同的结构。 列表可应1用在诸如 foreach 这样的以列表为变元的循环命令中,也应于构建 eval 命令的延迟命令字符串。 一、list 命令 list 命令用来创建列表…

城市内涝的解决措施,城市内涝积水监测预警系统解决方案

随着城市化进程的加快,城市土地面积不断扩大,原本吸收雨水的土地被水泥、沥青等硬质材料所取代,导致雨水无法迅速渗透和排泄,增加了城市内涝的风险。同时,气候变化带来的极端降雨事件频率增加,更加加剧了内…

mysql触发器监听数据投递中间件

目前市面上有许多的 CDC(Change Data Capture) 框架用于监听数据库的数据变动,例如:canal、Debezium、Maxwell等都是用来解析 binlog 日志实现事件的监听。但是有一个情况就是如果公司对 binlog 日志文件的权限管控的很严格&#…

传统ERP和SaaS ERP区别在哪里?

一、ERP和SaaS ERP概念 企业资源计划 (ERP) 系统是许多企业的主干,助力管理整个企业内的会计、采购流程、项目等。对于许多 IT 部门而言,ERP 系统通常意味着大型、昂贵且耗时的部署,并可能需要进行大量硬件或基础设施投资。然而,…

基于标准库函数的STM32的freertos的移植(三)——MDK工程搭建、配置与修改

1.打开MDK5软件,新建MDK工程,将新建工程文件保存在Project_Stm32f407/mdk文件夹下,并将工程命名为freertos_M4,选择MCU型号为STM32F407ZG,新建工程文件的步骤如下图所示: 图1 新建工程 图2 保存工程路径和工…

ChatGPT-AI地图

ChatGPT-AI地图 1、AI-对话 应用名称应用地址ChatGPThttps://chat.openai.com/NotionAINotion AIA.I. Data Sidekick:AI工具编写 SQL、文档等的速度提高10倍[AirOpsWritesonic:人工智能写作辅助工具Writesonic - Best AI Writer, Copywriting & Par…

《深入理解计算机系统(CSAPP)》第3章 程序的机器级表示 - 学习笔记

写在前面的话:此系列文章为笔者学习CSAPP时的个人笔记,分享出来与大家学习交流,目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记,在复习回看时发现部分内容存在一些小问题,因时间紧张来不及再次整理…

MySQL 数值函数

文章目录 数值函数1. abs(num)2. ceil(num)3. floor(num)4. mod(num1,num2)5. rand()6. round(num,n)7. truncate(num,n)8. sqrt(num) 数值函数 数值函数用来处理数值方面的运算,能够提高用户的工作效率。常用的数值函数如下表所示,函数括号内为输入的参…

牛客网基础语法11~20题

前言:今天是咱们第二期刷牛客网上的题目。 目标:对输入输出的格式,方法,类型掌握熟练,对double,float理解深入,编程思想更进一步。 鸡汤:人活着,再苦再累,都别…

16-Vue技术栈之常用的 Composition API

目录 1、什么是组合式 API?2、拉开序幕的setup3、ref函数4、reactive函数5、Vue3.0中的响应式原理5.1 vue2.x的响应式5.2 Vue3.0的响应式 6、reactive对比ref7、setup的两个注意点8、计算属性与监视8.1 computed函数8.2 watch函数8.3 watchEffect函数 9、 生命周期1…

防雷接地的施工工艺与防雷施工方案

雷电是自然界的一种强大而危险的自然现象,经常造成重大财产损失和人员伤亡。为了保护建筑物和人员免受雷电的危害,防雷接地系统的设计和施工至关重要。本文将介绍防雷接地的施工工艺和防雷施工方案,强调专业和符合国家标准的方法,…

chatgpt赋能python:Python中乘方运算符号:用于数学计算和科学计算

Python中乘方运算符号:用于数学计算和科学计算 简介 乘方运算是Python中常用的数学运算符,通常在数学计算和科学计算中使用。在Python中,乘方运算符用**表示。该运算符用于计算数字的指数幂。 用法 乘方运算符可以用于两个数字之间的计算…

vue开发环境搭建-win7

vue开发环境搭建-win7 1. 安装node,js2. 设置node global(全局)和cache(缓存)路径3. 配置环境变量4. 基于 Node.js 安装cnpm(淘宝镜像)5. 安装vue6. 安装vue脚手架 vue-cli7. 项目创建8. 添加相关依赖9. 修改端口号10. 运行项目 1. 安装node,js 下载no…