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-hk/n/185355.html
微信掃一掃
支付寶掃一掃