时间处理库Date-fns (v2.25.0)
这个库功能十分齐全,可能需要科学上网,这里记录一下之前做项目中常用的方法。
npm i date-fns
格式化(format)
import { format } from 'date-fns'
format(new Date(), 'yyyy-MM-dd HH:mm:ss') // <String> 2021-07-25 20:13:03
日期差(intervalToDuration)
根据出生日期得到几岁
import { intervalToDuration } from 'date-fns'
let birthday = new Date('1997-07-01')
const { years, months, days } = intervalToDuration({
start: new Date(birthday),
end: new Date()
}) // year即年龄,months和day可以再精确到天
时间差(differenceInMinutes)
比较开始时间和结束时间
if(differenceInMinutes(formData.end, formData.start) < 0) {
console.log('开始时间小于结束时间')
}
本地化/I18n(locale)
输出中文年月日
只有format相关函数支持
import format from 'date-fns/format'
import { zhCN } from 'date-fns/locale'
format(new Date(), "yyyy'年'M'月'd日", {locale: zhCN}) // 单个M在1~9月不补0
日期计算(addDays, subDays, addMonts, subMonth…)
获取当前周开始日期和结束日期
import { format, addDays, subDays, addMonths } from 'date-fns'
let weekDiff = new Date().getDay()
let endDate = format(addDays(nowDate, 7 - weekDiff), 'M.d')
let startDate = format(subDays(nowDate, weekDiff - 1), 'M.d')
console.log(`${startDate}~${endDate}`) // 7.19~7.25
判断时间是否规范
📚 不是Date对象的话返回false,该方法会用📚toDate方法进行转换。
import { isValid } from 'date-fns'
let date1 = new Date('')
let date2 = new Date(2021, 7, 25)
isValid(date1) // false
isValid(date2) // true
……
日期的小细节
IOS上日期无效问题
new Date('2021-7-25 20:13:03') 在IOS会报错,而在安卓上可以,new Date(‘2021-7-25’)则都可以。
原因是因为该日期格式不符合ES5(2019)新增的规则,如果想继续使用需要进行手动转换,或者学习新的ECMA规则。
📝 手动转换
**
* 将日期字符串转成标准日期(ios上无法识别格式:yyyy-MM-dd HH:mm:ss)
* @param {String} str
* @returns {Date} 标准日期
*/
export const parseDate = (str) => {
var parts = str.split(" ");
var dateparts = parts[0].split("-");
var timeparts = (parts[1] || "").split(":");
var year = +dateparts[0];
var month = +dateparts[1];
var day = +dateparts[2];
var hours = timeparts[0] ? +timeparts[0] : 0;
var minutes = timeparts[1] ? +timeparts[1] : 0;
var seconds = timeparts[2] ? +timeparts[2] : 0;
// return new Date(Date.UTC(year, month - 1, day, hours, minutes, seconds));
return new Date(year, month - 1, day, hours, minutes, seconds);
}