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

本文简介

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


  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

使用

// 引入 dayjs
import dayjs from 'dayjs'

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

cdn

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

<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>
<script>
// 输出当前时间
console.log(dayjs())
</script>


格式化日期格式

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

file

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

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

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


基础用法

file

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

自定义格式

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

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

占位符输出详情
YY18两位数的年份
YYYY2018四位数的年份
M1-12月份,从 1 开始
MM01-12月份,两位数
MMMJan-Dec缩写的月份名称
MMMMJanuary-December完整的月份名称
D1-31月份里的一天
DD01-31月份里的一天,两位数
d0-6一周中的一天,星期天是 0
ddSu-Sa最简写的星期几
dddSun-Sat简写的星期几
ddddSunday-Saturday星期几
H0-23小时
HH00-23小时,两位数
h1-12小时, 12 小时制
hh01-12小时, 12 小时制, 两位数
m0-59分钟
mm00-59分钟,两位数
s0-59
ss00-59秒 两位数
SSS000-999毫秒 三位数
Z+05:00UTC 的偏移量,±HH:mm
ZZ+0500UTC 的偏移量,±HHmm
AAM PM
aam pm

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

// 年
dayjs().format('YY') // 返回 23 (写本文时是2023年)
dayjs().format('YYYY') // 返回 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一起使用。

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

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

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

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

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

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

简单吧,好用吧~

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



获取/设置日期时间

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

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

我这里举个例子。

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

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

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

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


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



日期时间计算

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


增加日期时间

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

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

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

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

单位缩写详情
dayd
weekw
monthM
yeary
hourh小时
minutem分钟
seconds
millisecondms毫秒

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


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

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

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

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

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


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

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

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

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

比如获取10天前的时间。

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

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


减少日期时间

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

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

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

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

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


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

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

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

获取开始日期时间

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

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

单位缩写详情
yeary今年一月1日上午 00:00
monthM本月1日上午 00:00
weekw本周的第一天上午 00:00 (取决于国际化设置)
dateD当天 00:00
dayd当天 00:00
hourh当前时间,0 分、0 秒、0 毫秒
minutem当前时间,0 秒、0 毫秒
seconds当前时间,0 毫秒

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


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

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

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

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


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

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() 的语法:

时间1.diff(时间2)

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

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


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

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

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

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

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

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

单位缩写详情
dayd
weekwWeek of Year
quarterQQuarter
monthM月份 (一月 0, 十二月 11)
yearyYear
hourhHour
minutemMinute
secondsSecond
millisecondmsMillisecond


日期时间查询

查询指定月份有多少天

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

举起一个拳头👊

file

不好意思,搞错了。。。

file

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


判断两个时间是否相同

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

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

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

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

// 年份相同就返回 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年 之间,可以这么写:

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

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


推荐阅读

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

👍《P5.js 光速入门》

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

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

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


点赞 + 关注 + 收藏 = 学会了 代码仓库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32中除零运算,为何程序不崩溃?

在 C 语言中&#xff0c;除零运算会导致异常吗&#xff1f; 在 C 语言中&#xff0c;当一个数除以零时&#xff0c;会导致除法运算错误&#xff0c;通常表现为“除以零”错误或被称为“浮点异常”&#xff08;floating-point exception&#xff09;。 对于整数除法&#xff0c…

Unity的galgame形式对话系统工具

这段代码用于读取表格 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using OfficeOpenXml; using System.IO; using UnityEngine.Networking; using UnityEngine.UI; using Random UnityEngine.Random;public class Plots…

Java中会出现内存泄漏吗

这是一个老生常谈的面试题&#xff0c;本文就系统讲解一下吧 虽然Java有GC垃圾⾃动回收功能&#xff0c;但并不是说Java程序就不会内存泄漏。如果一个对象没有地⽅会使⽤到&#xff0c;但是却仍然有引用指向他&#xff0c;那么垃圾回收器就无法回收他&#xff0c;这种情况就属于…

【哈士奇赠书活动 - 44期】- 〖从零基础到精通Flutter开发〗

文章目录 ⭐️ 赠书 - 《从零基础到精通Flutter开发》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《从零基础到精通Flutter开发》 ⭐️ 内容简介 本书由浅入深地带领读者进入Flutter开发的世界&#xff0c;从Flutter的起源讲起&#xff0c…

上海亚商投顾:沪指震荡反弹 华为汽车、卫星通信板块再度爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一、市场情绪 三大指数早盘低开低走&#xff0c;深成指、创业板指一度跌超1%&#xff0c;午后集体拉升翻红。 华为汽车概念…

MySQL之事务、存储引擎、索引

文章目录 前言一、事务1.概念2.操作&#xff08;1&#xff09;开启事务&#xff08;2&#xff09;提交事务&#xff08;3&#xff09;回滚事务 3.四大特性ACID&#xff08;1&#xff09;原子性&#xff08;Atomicity&#xff09;&#xff08;2&#xff09;一致性&#xff08;Co…

利用dns协议发起ddos反射攻击

利用DNS服务器发起反射型DDOS&#xff0c;攻击带宽 基本思路&#xff1a; 1、利用any类型的dns查询&#xff0c;可完成发送少量请求数据&#xff0c;获得大量返回数据。 2、将原请求地址改为受害者地址&#xff0c;则dns会向受害者返回大量数据&#xff0c;占用带宽 警告&…

Jenkins部署失败:JDK ‘jdk1.8.0_381‘ not supported to run Maven projects

Jenkins部署报错&#xff1a;JDK ‘jdk1.8.0_381’ not supported to run Maven projects提示使用的jdk有问题&#xff0c;启动的jdk版本不能满足项目启动。 登录Jenkins管理页面&#xff0c;系统管理——全局工具配置——JDK安装配置满足条件的JDK版本&#xff0c;保存配置&…

TSINGSEE青犀老旧小区升级改造AI+视频监控方案

一、背景与需求 近年来&#xff0c;政府高度重视城镇老旧小区改造工作&#xff0c;强调要加快老旧小区改造&#xff0c;不断完善城市管理和服务&#xff0c;彻底改变粗放型管理方式&#xff0c;让人民群众在城市生活得更方便、更舒心、更美好。老旧小区升级改造面临以下问题&a…

ETO制造商目前面临的六大挑战,如何应对?

与离散制造、库存制造不同&#xff0c;按订单设计制造&#xff08;ETO&#xff09;行业面临着一系列独特的挑战。从复杂的产品设计到与客户的密切联系&#xff0c;按订单生产的每件产品都不尽相同。 如果采用按订单生产方式制造产品&#xff0c;管理者总是会想方设法采购最好的…

cmd 命令关闭占用端口

工作中还是偶尔会遇到端口号被占用的情况&#xff0c;之前也有写过另一种关闭方式&#xff0c;但是发现没有命令方便&#xff0c;所以记录一下。 1、 查看 8081 端口占用的 pid 。 命令&#xff1a;netstat -ano |findstr 8081 由上图可知&#xff0c;占用 8081 端口的进程 id…

【ArcGIS模型构建器】05:批量为多个矢量数据添加相同的字段

本文实现借助arcgis模型构建器,实现批量为多个土地利用矢量数据添加相同的字段,例如DLMC,DLTB等。 文章目录 问题分析模型构建问题分析 有多个土地利用数据矢量图层,每个图层中有很多个图斑,现在需要给每个图层添加一个或者多个字段,如DLCM,DLBM等。 属性表如下所示: …

创建并启动华为HarmonyOS本地与远程模拟器及远程真机

1.打开设备管理器 2.选择要添加的手机设备,然后点击安装 3.正在下载华为手机模拟器 4.下载完成 5.创建新模拟器 下载系统镜像 点击下一步,创建模拟器 创建成功 启动模拟器 华为模拟器启动成功 6.登陆华为账号并使用远程模拟器 7.使用远程真机

实时数仓-Hologres介绍与架构

本文是向大家介绍Hologres是一款实时HSAP产品&#xff0c;隶属阿里自研大数据品牌MaxCompute&#xff0c;兼容 PostgreSQL 生态、支持MaxCompute数据直接查询&#xff0c;支持实时写入实时查询&#xff0c;实时离线联邦分析&#xff0c;低成本、高时效、快速构筑企业实时数据仓…

【MySQL索引与优化篇】InnoDB数据存储结构

文章目录 1. 数据库的存储结构:页1.1 磁盘与内存交互基本单位:页1.2 页结构概述1.3 页的上层结构 2. 页的内部结构3. InnoDB行格式(或记录格式)3.1 Compact行格式3.2 Dynamic和Compressed行格式3.3 Redundant行格式 4. 区、段与碎片区4.1 为什么要有区&#xff1f;4.2 为什么要…

vue手动拖入和导入excel模版

1.列表按钮 <el-button click“importExcel(scope.row.id)” size“small” type“text”>导入excel模版 2.按钮弹框 3.data定义数据 data () { return { projectId: ‘’, importDialogVisible: false, fileList: [], //手动上传 upload_file: ‘’, //导入excel模版…

35二叉树-树的最小深度

目录 LeetCode之路——111. 二叉树的最小深度 分析 解法一&#xff1a;广度优先查询 解法二&#xff1a;深度优先查询 LeetCode之路——111. 二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…

Visual Studio(VS)C++项目 管理第三方依赖库和目录设置

发现很多程序员存在这种做法&#xff1a;把项目依赖的第三方库的lib和dll放在项目目录下&#xff0c;或者复制到输出目录&#xff0c;因为每种配置都有不同的输出目录&#xff0c;所以要复制多份&#xff08;至少包括Debug和Release两个输出目录&#xff09;&#xff0c;这些做…

axios封装以及详细用法

文章目录 axios用法(这里没有封装&#xff0c;下面有封装好的get&#xff0c;post方法&#xff0c;在axios封装里面)get &#xff0c;delete方法post&#xff0c;put方法 axios具体封装axios 具体参数配置 axios用法(这里没有封装&#xff0c;下面有封装好的get&#xff0c;pos…

【DRAM存储器十七】DDR2介绍-DDR2的新增技术-Post CAS、ODT、RDQS、OCD

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光DDR数据手册》 目录 Post CAS ODT RDQS OCD Post CA…