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
英文地址,請注明出處:http://en.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…