JS日期加減是前端開發中經常會用到的功能,但卻常常會出現各種意想不到的問題。本文將從多個方面詳細闡述JS日期加減的技巧,幫助讀者優雅地完成日期的加減操作。
一、JS日期對象
JS中的日期對象是一個內置對象,其構造函數是 Date()
。Date對象表示的是自1970年1月1日 00:00:00 UTC(以此即格林威治時間為起點)到指定時間之間所經過的毫秒數。除了可以獲取當前時間外,我們還可以使用構造函數,將日期以不同的格式輸入來構造一個日期對象。
下面是一些關於JS日期對象的示例代碼:
// 獲取當前時間(本地時區) const now = new Date() // 按照字元串輸入日期 const date1 = new Date("2022/12/31") // 按照數字輸入日期 const date2 = new Date(2022, 11, 31) // 獲取時間戳 const timestamp = Date.now()
二、日期加減的基礎操作
JS日期加減的操作可以通過Date對象中的set和get方法來實現,這些方法代表「設定某個值」和「獲取某個值」這兩個基本操作。我們通常需要用到的有:
getFullYear()
:獲取當前時間的年份setFullYear(year)
:修改時間的年份getMonth()
:獲取當前時間的月份(範圍為0~11)setMonth(month)
:修改時間的月份(範圍為0~11)getDate()
:獲取當前時間的日期setDate(date)
:修改時間的日期getHours()
:獲取當前時間的小時數(24小時制)setHours(hours)
:修改時間的小時數(24小時制)getMinutes()
:獲取當前時間的分鐘數setMinutes(minutes)
:修改時間的分鐘數getSeconds()
:獲取當前時間的秒數setSeconds(seconds)
:修改時間的秒數
下面是一些關於日期加減基礎操作的示例代碼:
const now = new Date() // 獲取當前日期 const year = now.getFullYear() const month = now.getMonth() + 1 const date = now.getDate() // 將時間設置為前一天 now.setDate(date - 1)
三、使用庫進行日期加減
如果只是需要簡單地進行一些日期加減操作,使用Date對象的方法已經足夠了。但是,如果需要進行一些更加複雜的日期運算,比如說跨越時區,或者處理「閏年」,那麼就需要引入一些第三方的日期庫。這些庫不僅提供了更加便捷的API,而且它們的內部演算法也經過了長時間的驗證和優化,因此具有更高的穩定性和可靠性。
下面介紹兩個常用的日期庫:
moment.js
const moment = require('moment') // 獲取當前時間 const now = moment() // 加一天 now.add(1, 'days') // 轉換成字元串 const str = now.format('YYYY-MM-DD')
day.js
const dayjs = require('dayjs') // 獲取當前時間 const now = dayjs() // 加一天 now = now.add(1, 'day') // 轉換成字元串 const str = now.format('YYYY-MM-DD')
四、時區處理的問題
時區的處理是日期運算中一個很常見的問題,尤其是在處理時間戳的時候。因為時間戳是以UTC時間為基準的,但實際的應用場景中,時間戳經常需要轉化成對應時區的形式。在使用Date對象時,我們可以通過一些方法來進行時區的轉換,比如說:
getTimezoneOffset()
:獲取當前時區與UTC之間的時間差(單位:分鐘)toLocaleString()
:轉換成本地時區的字元串表示toUTCString()
:轉換成UTC時區的字元串表示
但是,這些方法仍然不能適應所有的日期場景,因此通常需要藉助一些第三方庫來進行時區轉換和計算。比如說,Moment.js提供了一個叫做moment-timezone.js的時區插件,可以方便地進行時間的轉換和計算。
const moment = require('moment-timezone') const now = moment.tz('2019-07-01 00:00:00', 'America/New_York') // 轉換時區 now.tz('Asia/Shanghai') // 轉換成指定格式的字元串 const str = now.format('YYYY-MM-DD HH:mm:ss')
五、「閏年」問題的處理
在JS日期運算中,我們常常需要處理「閏年」這個問題。實際上,在閏年的情況下,2月份的天數是29天,而在非閏年的情況下,2月份的天數則是28天。因此,在處理日期運算時,需要先判斷當前年份是否是閏年,然後再根據實際情況進行處理。
const isLeapYear = (year) => { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 } const date = new Date() const year = date.getFullYear() const month = date.getMonth() const day = date.getDate() // 判斷是否為閏年 if (isLeapYear(year)) { // 處理閏年2月的情況 } else { // 處理非閏年2月的情況 }
六、日期加減操作的實際應用
最後,我們來看一下日期加減操作在實際開發中的應用實例。
比如說,我們需要獲取「本周一」的日期,可以使用下面的代碼:
const date = new Date() const day = date.getDay() // 獲取當前星期幾,0代表周日,1代表周一,以此類推 const monday = new Date(date.getTime() - day * 24 * 60 * 60 * 1000)
如果我們需要生成「未來n天」的日期列表,可以使用下面的代碼:
const n = 7 const now = new Date() for (let i = 0; i < n; i++) { const day = new Date(now.getTime() + i * 24 * 60 * 60 * 1000) console.log(day.toLocaleDateString()) }
如果我們需要把一個日期轉化成幾天前或者幾天後的日期,可以使用下面的代碼:
const n = -1 // n>0 表示n天后,n<0 表示n天前 const date = new Date() date.setDate(date.getDate() + n) console.log(date.toLocaleDateString())
七、總結
本文從JS日期對象、日期加減的基礎操作、庫的使用、時區處理以及「閏年」問題等多個方面詳細闡述了JS日期加減的技巧。相信通過本文的介紹,讀者已經掌握了優雅地完成日期加減操作的技巧,並能夠在實際開發中靈活運用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/185355.html