react day.js使用及经典场景

简介

Day.js 是一个轻量级的 JavaScript 日期库,它提供了简单易用的 API 来处理日期和时间。以及更加轻量级,并且具有更快的性能。

安装

npm install dayjs

使用

import dayjs from "dayjs";dayjs().format("YYYY-MM-DD HH:mm:ss");

经典场景

1. 获取当前时间

dayjs().format("YYYY-MM-DD HH:mm:ss");

2. 格式化时间

dayjs("2021-01-01").format("YYYY-MM-DD HH:mm:ss");

3. 解析时间

dayjs("2021-01-01 12:00:00", "YYYY-MM-DD HH:mm:ss");

4. 时间加减

dayjs().add(1, "day").format("YYYY-MM-DD HH:mm:ss");
dayjs().subtract(1, "day").format("YYYY-MM-DD HH:mm:ss");

5. 时间比较

dayjs("2021-01-01").isBefore("2021-01-02");
dayjs("2021-01-01").isAfter("2021-01-02");
dayjs("2021-01-01").isSame("2021-01-01");

6. 获取时间差

dayjs("2021-01-01").diff("2021-01-02", "day");
类型说明
year
quarter季度
month
week
day
hour小时
minute分钟
second
millisecond毫秒

diff 默认返回是整数,如果需要返回小数,可以传入第三个参数:true|false。

7. 快速获取常用日期

# 前一天
dayjs().subtract(1, "day").format("YYYY-MM-DD HH:mm:ss");
# 后一天
dayjs().add(1, "day").format("YYYY-MM-DD HH:mm:ss");
# 前一周
dayjs().subtract(1, "week").format("YYYY-MM-DD HH:mm:ss");
# 后一周
dayjs().add(1, "week").format("YYYY-MM-DD HH:mm:ss");
# 前一月
dayjs().subtract(1, "month").format("YYYY-MM-DD HH:mm:ss");
# 后一月
dayjs().add(1, "month").format("YYYY-MM-DD HH:mm:ss");
# 前一季
dayjs().subtract(1, "quarter").format("YYYY-MM-DD HH:mm:ss");
# 后一季
dayjs().add(1, "quarter").format("YYYY-MM-DD HH:mm:ss");
# 前一年
dayjs().subtract(1, "year").format("YYYY-MM-DD HH:mm:ss");
# 后一年
dayjs().add(1, "year").format("YYYY-MM-DD HH:mm:ss");

8. 日期范围

import dayjs from "dayjs";
import isBetween from "dayjs/plugin/isBetween";dayjs.extend(isBetween);// 是否属于某个范围
dayjs("2021-01-01").isBetween("2021-01-01", "2021-01-02");
// 是否属于某个范围(包含边界)
// [ 包含开始日期,包含结束日期 ]
// ( 不包含开始日期,不包含结束日期 )
dayjs("2021-01-01").isBetween("2021-01-01", "2021-01-02", "day", "[)");

9. 倒计时实现

import { useState, useEffect, useCallback, useRef } from "react";
import dayjs from "dayjs";
import duration from "dayjs/plugin/duration";dayjs.extend(duration);/*** 倒计时 Hook* @param {number} targetTime - 目标时间戳(毫秒)* @param {number} interval - 更新间隔(毫秒),默认 1000ms* @returns {Object} 倒计时状态* @returns {number} remainingTime - 剩余时间(毫秒)* @returns {boolean} isFinished - 是否结束* @returns {Object} formattedTime - 格式化后的时间对象* @returns {Function} reset - 重置倒计时*/
export default function useCountdown(targetTime, interval = 1000) {const [remainingTime, setRemainingTime] = useState(0);const [isFinished, setIsFinished] = useState(false);const targetTimeRef = useRef(targetTime);// 计算剩余时间const calculateRemainingTime = useCallback(() => {const now = dayjs();const target = dayjs(targetTimeRef.current);const diff = target.diff(now);if (diff <= 0) {setRemainingTime(0);setIsFinished(true);return;}setRemainingTime(diff);setIsFinished(false);}, []);// 格式化时间const formatTime = useCallback((time) => {const duration = dayjs.duration(time);return {days: Math.floor(duration.asDays()),hours: duration.hours(),minutes: duration.minutes(),seconds: duration.seconds(),milliseconds: duration.milliseconds(),};}, []);// 重置倒计时const reset = useCallback(() => {// 更新目标时间引用targetTimeRef.current = dayjs().add(24, "hour").valueOf();setIsFinished(false);calculateRemainingTime();}, [calculateRemainingTime]);useEffect(() => {// 初始化目标时间targetTimeRef.current = targetTime;// 初始化calculateRemainingTime();// 设置定时器const timer = setInterval(() => {calculateRemainingTime();}, interval);// 清理定时器return () => clearInterval(timer);}, [calculateRemainingTime, interval, targetTime]);return {remainingTime,isFinished,formattedTime: formatTime(remainingTime),reset,};
}// hook使用
const { formattedTime, isFinished, reset } = useCountdown(targetTime);

10. 日历组件实现

import { useState, useMemo } from "react";
import dayjs from "dayjs";
import weekOfYear from "dayjs/plugin/weekOfYear";
import isoWeek from "dayjs/plugin/isoWeek";dayjs.extend(weekOfYear);
dayjs.extend(isoWeek);export default function Calendar() {const [currentDate, setCurrentDate] = useState(dayjs());const [selectedDate, setSelectedDate] = useState(dayjs());// 生成日历数据const calendarData = useMemo(() => {const firstDayOfMonth = currentDate.startOf("month");const lastDayOfMonth = currentDate.endOf("month");const firstDayOfWeek = firstDayOfMonth.day();const daysInMonth = lastDayOfMonth.date();const daysInPrevMonth = firstDayOfMonth.subtract(1, "month").daysInMonth();const days = [];// 上个月的天数for (let i = firstDayOfWeek - 1; i >= 0; i--) {days.push({date: firstDayOfMonth.subtract(i + 1, "day"),isCurrentMonth: false,});}// 当前月的天数for (let i = 1; i <= daysInMonth; i++) {days.push({date: currentDate.date(i),isCurrentMonth: true,});}// 下个月的天数const remainingDays = 42 - days.length; // 6行7列for (let i = 1; i <= remainingDays; i++) {days.push({date: lastDayOfMonth.add(i, "day"),isCurrentMonth: false,});}return days;}, [currentDate]);// 切换月份const changeMonth = (delta) => {setCurrentDate(currentDate.add(delta, "month"));};// 切换年份const changeYear = (delta) => {setCurrentDate(currentDate.add(delta, "year"));};// 判断是否是今天const isToday = (date) => {return date.isSame(dayjs(), "day");};// 判断是否是选中日期const isSelected = (date) => {return date.isSame(selectedDate, "day");};return (<div className="w-full max-w-md mx-auto bg-white rounded-lg shadow-lg p-4">{/* 日历头部 */}<div className="flex items-center justify-between mb-4"><div className="flex items-center space-x-2"><buttononClick={() => changeYear(-1)}className="p-2 hover:bg-blue-50 rounded-full transition-colors">{"<<"}</button><buttononClick={() => changeMonth(-1)}className="p-2 hover:bg-blue-50 rounded-full transition-colors">{"<"}</button></div><div className="text-lg font-semibold text-blue-600">{currentDate.format("YYYY年 MM月")}</div><div className="flex items-center space-x-2"><buttononClick={() => changeMonth(1)}className="p-2 hover:bg-blue-50 rounded-full transition-colors">{">"}</button><buttononClick={() => changeYear(1)}className="p-2 hover:bg-blue-50 rounded-full transition-colors">{">>"}</button></div></div>{/* 星期标题 */}<div className="grid grid-cols-7 gap-1 mb-2">{["日", "一", "二", "三", "四", "五", "六"].map((day) => (<divkey={day}className="text-center text-sm font-medium text-blue-600 py-2">{day}</div>))}</div>{/* 日历主体 */}<div className="grid grid-cols-7 gap-1">{calendarData.map(({ date, isCurrentMonth }, index) => (<buttonkey={index}onClick={() => setSelectedDate(date)}className={`aspect-square p-1 text-sm rounded-lg transition-colors${isCurrentMonth? "hover:bg-blue-50": "text-gray-400 hover:bg-gray-50"}${isToday(date) ? "bg-blue-100" : ""}${isSelected(date)? "bg-blue-500 text-white hover:bg-blue-600": ""}`}>{date.date()}</button>))}</div></div>);
}

11.国际化

import dayjs from "dayjs";
import "dayjs/locale/zh-cn";dayjs.locale("zh-cn");
dayjs().format("YYYY-MM-DD HH:mm:ss");

 更多用法

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

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

相关文章

【机器学习深度学习】线性回归

目录 一、定义 二、举例说明 三、 数学形式 四、 训练过程&#xff08;机器怎么学会这条线&#xff1f;&#xff09; 五、在 PyTorch 中怎么实现线性回归&#xff1f; 六、如果你学懂了线性回归&#xff0c;你也能理解这些 七、综合应用&#xff1a;线性回归示例 7.1 执…

如何在 Manjaro Linux 上安装 .NET Core

.NET 是一个开源的开发框架平台,可在所有流行的操作系统(如 Windows、Linux 和 macOS)上免费使用和安装。它是跨平台的,是主要由微软员工在 .NET 基金会下开发的专有 .NET Framework 的继承者。.NET 是一个统一的平台,用于开发各种操作系统上的软件,如 Web、移动、桌面应…

Mysql解惑(一)

使用 or 可能不走索引 使用 union替代 使用in&#xff0c;可能不走索引 如果优化&#xff1a; 临时表强制索引exists代替

基于机器学习的侧信道分析(MLSCA)Python实现(带测试)

一、MLSCA原理介绍 基于机器学习的侧信道分析(MLSCA)是一种结合传统侧信道分析技术与现代机器学习算法的密码分析方法。该方法通过分析密码设备运行时的物理泄漏信息(如功耗、电磁辐射等)&#xff0c;利用机器学习模型建立泄漏数据与密钥信息之间的关联模型&#xff0c;从而实…

【LLM】位置编码

【LLM】位置编码 1 绝对位置嵌入为什么用 1000 0 2 t d 10000^{\frac{2t}{d}} 10000d2t​? 2 相对位置嵌入2.1 Shaw等人的方法&#xff08;2018&#xff09;2.2 Dai等人的方法&#xff08;2019&#xff09;2.3 Raffel 等人的方法&#xff08;2020&#xff09;2.4 He 等人的方法…

Java 根据分组key构建合并数据集

文章目录 前言背景总结 前言 请各大网友尊重本人原创知识分享&#xff0c;谨记本人博客&#xff1a;南国以南i、 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 背景 Java 需要返回一组数据供前端展示&#xff0c;获取到的数据格式如下&#xff1a; …

Linux平台Oracle开机自启动设置

网上和官方文档已经有不少介绍如何设置开机启动Oracle实例的文章(Linux平台)&#xff0c;不过以sysvinit和service这种方式居多。最近遇到了UAT环境的服务器打补丁后需要重启服务器的情况&#xff0c; 需要DBA去手工启动Oracle实例的情形&#xff0c;和同事讨论&#xff0c;决定…

商品中心—商品B端搜索系统的实现文档(二)

8.步骤四&#xff1a;基于索引实现搜索功能 (1)基于suggest索引的自动补全实现 实现自动补全的代码比较简单&#xff0c;其原理是&#xff1a;把搜索词汇和倒排索引里的所有前缀匹配的词条进行score比较&#xff0c;然后把分数最高的那些返回&#xff0c;其中会涉及到suggest索…

Codeforces Round 1027 (Div. 3)

A. Square Year 题目大意 给你一个四个字符的字符串&#xff0c;代表一个数字s 问是否存在a,b两个数字&#xff0c;使得 ( a b ) 2 s (ab)^2s (ab)2s 思路 如果s是奇数或不能被开根号一定不行 设sq为s开根号后的结果 将sq一分为2&#xff0c;考虑sq/2有没有余数的情况 //…

时序数据库IoTDB的架构、安装启动方法与数据模式总结

一、IoTDB的架构 IoTDB的架构主要分为三个部分&#xff1a; ‌时序文件&#xff08;Tsfile&#xff09;‌&#xff1a; 专为时序数据设计的文件存储格式。支持高效的压缩和查询性能。可独立使用&#xff0c;并可通过TsFileSync工具同步至HDFS进行大数据处理。 ‌数据库引擎‌…

ArrayList和LinkedList详解

在Java后端开发中&#xff0c;集合框架是我们日常编程不可或缺的工具&#xff0c;它为数据存储和操作提供了丰富的实现方式。作为Java集合框架中最常用的两种List实现&#xff0c;ArrayList和LinkedList各自具有独特的特性和适用场景。 1. 基本概念 1.1 ArrayList的定义与特性…

警惕微软Entra ID风险:访客账户存在隐蔽的权限提升策略

访客用户订阅权限漏洞解析 微软Entra ID的订阅管理存在访问控制缺陷&#xff0c;允许访客用户在受邀租户中创建和转移订阅&#xff0c;同时保留对这些订阅的完全所有权。访客用户只需具备在源租户创建订阅的权限&#xff0c;以及受邀成为外部租户访客的身份即可实施此操作。这…

EEG分类攻略2-Welch 周期图

在EEG信号处理的上下文中&#xff0c;使用Welch方法来估算信号的功率谱密度&#xff08;Power Spectral Density, PSD&#xff09;是一种常见的做法。你的代码片段是利用**scipy.signal.welch**函数来进行功率谱密度估算&#xff0c;并且涉及到一些关键的参数和步骤。让我们逐步…

开疆智能CCLinkIE转ModbusTCP网关连接脉冲计数器配置案例

本案例是三菱PLC通过CCLinkIE转ModbusTCP网关连接脉冲计数器的配置案例&#xff0c;具体配置如下。 配置过程&#xff1a; 首先设置从站通讯参数 主要设置IP地址&#xff0c;工作模式以及端口号&#xff08;Modbus默认502&#xff09; 找到通讯点表&#xff0c;找到需要读写的…

gRPC 使用(python 版本)

.proto 文件 .proto 文件 是 gRPC 和 Protocol Buffers 的接口定义文件&#xff0c;它描述了&#xff1a; 要传递什么数据&#xff08;也就是消息体 message&#xff09;。要暴露什么接口&#xff08;也就是服务 service 和它们的 方法&#xff09;。 也就是一份规范文件&am…

VMware安装

勾选【增强型键盘驱动程序】 #后期虚拟机用鼠标键盘比较好用 VMware创建主机Windows2 选择类型配置【自定义】 安装客户机操作系统【稍后安装操作系统】 客户机操作系统【Microsoft Windows】,版本选Windows最高版本 【固件类型】默认UEFI 【处理器配置】选1个处理…

【沉浸式解决问题】微服务子模块引入公共模块的依赖后无法bean未注入

目录 一、问题描述二、场景还原三、原因分析四、解决方案五、拓展知识参考文献 一、问题描述 在微服务项目中的公共模块进行了Mybatis Plus配置&#xff0c;创建了配置类并添加了Configuration注解&#xff0c;其他模块引入该模块后不生效 我这里是在Mybatis Plus公共模块中注…

SQL进阶:CASE表达式

目录 1、用一条SQL语句进行不同条件的统计 建表语句&#xff08;MySQL8&#xff09;&#xff1a; 录入数据&#xff1a; *按性别统计SQL 输出结果&#xff08;行列转换&#xff09; 2、在UPDATE语句里进行条件分支 建表语句&#xff08;MySQL8&#xff09;&#xff1a;…

哪四款AI工具让3D人物手办制作如此简单?

在当今数字化时代&#xff0c;AI技术的飞速发展为我们的生活带来了诸多便利和惊喜。其中&#xff0c;AI生成3D人物手办工具的出现&#xff0c;让我们能够轻松地将自己的创意和想象转化为实体手办&#xff0c;满足了众多手办爱好者的个性化需求。今天&#xff0c;我将为大家推荐…

Docker高级管理--Dockerfile镜像制作

目录 一:Docker 镜像管理 1:Docker 镜像结构 2:Dockerfile介绍 二:Dockerfile 语法基础 1:基础指令 2:环境设置指令 3:文件操作指令 4:执行命令指令 5:网络和暴露端口指令 6.容器挂载指令 三&#xff1a;dockerfile案例 1.构建nginx容器 一:Docker 镜像管理 Docker…