我们在做项目的时候常常遇见日期格式化的问题,在我还是小白的时候遇见一次写一次...,现在看来真的很low币。在这这篇文章之前,也看到有许多大佬已经封装了日期格式化的东西,但是还是以学习为目的边写边练了,顺便记录一下,仅供参考
1️⃣. 基础
在CV之前应该补充一些JavaScript基础的时间类与方法,自我感觉真的不用记太多,下面代码的这几个就可以了,真实全部要求原生写,那确实很CD,那就直接 console.dir() 看就行了
const currentDate = new Date();
console.dir(currentDate);// 获取当前时间 Fri Sep 01 2023 11:50:36 GMT+0800 (中国标准时间)
let year = currentDate.getFullYear() // 获取当前年
let month = currentDate.getMonth() + 1 // 获取当前月(需要注意的是getMonth方法获取的月份会少1)
let day = currentDate.getDate() // 获取当前日
let hour = currentDate.getHours() // 获取当前时
let minute = currentDate.getMinutes() // 获取当前分
let second = currentDate.getSeconds() // 获取当前秒
let week = currentDate.getDay() // 获取当前星期几
let timestamp = currentDate.getTime() // 获取当前时间戳
let weekList = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
console.log(`🎉${year}-${month}-${day} ${hour}:${minute}:${second}`);
// 输出结果: 🎉2023-9-1 11:50:36
console.log(`🎉今天${weekList[week]},时间戳是${timestamp}`);
// 输出结果:🎉今天星期五,时间戳是1693540236765
2️⃣. 几种常用的格式化方法
🔴. 整体格式化日期时间
按照一定的格式进行时间的输出,该方法仅支持三种格式:1. 日期时间:yyyy-MM-dd HH:mm:ss ;2. 日期:yyyy-MM-dd ;3.时间:HH:mm:ss
按照自己项目的业务自行进行修改
function formatterDate({date,format = "yyyy-MM-dd HH:mm:ss"}) {
let currentDate = date || new Date();
let year = currentDate.getFullYear()
let month = currentDate.getMonth() + 1
let day = currentDate.getDate()
let hour = currentDate.getHours()
let minute = currentDate.getMinutes()
let second = currentDate.getSeconds()
let time = ""
switch (format) {
case "yyyy-MM-dd HH:mm:ss":
time =
`${year}-${`${month}`.padStart(2,'0')}-${`${day}`.padStart(2,'0')} ${`${hour}`.padStart(2,'0')}:${`${minute}`.padStart(2,'0')}:${`${second}`.padStart(2,'0')}`
break;
case "yyyy-MM-dd":
time =
`${year}-${`${month}`.padStart(2,'0')}-${`${day}`.padStart(2,'0')}`
break
case "HH:mm:ss":
time =
`${`${hour}`.padStart(2,'0')}:${`${minute}`.padStart(2,'0')}:${`${second}`.padStart(2,'0')}`
break
default:
break;
}
return time
}
🟣. 格式化星期
按照规定,每周的第一天是星期日,我们只需根据获取到的值进行列表取值即可
function formatWeek(week) {
let curWeek = week || new Date().getDay()
let weekList = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
return weekList[curWeek]
}
🟡. 计算某个时间距离当前时间多久
传入时间戳,计算输入传入时间距离当前时间有多久。
输出结果:刚刚、X分钟前/后、X小时前/后、X天前/后、X月前/后、X年前/后
function timeDistance(timestamp) {
// 判断传入的是否是时间戳
if (!timestamp) throw (new Error('Date Error:The timestamp cannot be empty'))
if (isNaN(timestamp)) throw (new Error('Type Error:A timestamp is not a Number'))
if (`${timestamp}`.length !== 13) throw (new Error('Length Error:The timestamp length is incorrect'))
let currentTime = new Date().getTime(); // 获取当前时间戳,可根据业务进行调整,比如距离某一特定时间多久
let diffTime = currentTime - timestamp; // 获取时间差值
let flag = diffTime < 0 ? '后' : '前'; // 根据差值判断传入时间是之后的还是以前的
diffTime = Math.abs(diffTime) // 将时间差值处理成正数
let minute = 60 * 1000;
let hour = minute * 60;
let day = hour * 24;
let month = day * 30;
// 获取距离的真正时间
let ago = ''
let minuteAgo = parseInt(diffTime / minute)
let hourAgo = parseInt((diffTime % minute) / hour)
let dayAgo = parseInt((diffTime % hour) / day)
let monthAgo = parseInt((diffTime % day) / month)
if (monthAgo > 11) {
ago = `${parseInt(monthAgo/12)}年${flag}`
} else if (monthAgo > 0) {
ago = `${monthAgo}月${flag}`
} else if (dayAgo > 0) {
ago = `${dayAgo}天${flag}`
} else if (hourAgo > 0) {
ago = `${hourAgo}小时${flag}`
} else if (minuteAgo > 0) {
ago = `${minuteAgo}分钟${flag}`
} else {
ago = `刚刚`
}
return ago
}
🟢. 获取当前年有多少天
function getDaysByYear(year) {
let curYear = Number(year) || new Date().getFullYear()
return curYear % 4 == 0 ? 366 : 365
}
🔵. 常用的也没有太多,感觉第一个基本上已经足够😂,后续业务遇到再补充吧
3️⃣. 轻量且使用方便的日期格式化库
这里我推荐的使用的是 day.js ,因为真的很好用。
Day.js 是一个轻量的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持完全一样. 如果您曾经用过 Moment.js, 那么您已经知道如何使用 Day.js
优点:
🕒和 Moment.js 相同的 API 和用法
💪不可变数据 (Immutable)
🔥支持链式操作 (Chainable)
🌐国际化 I18n
📦仅 2kb 大小的微型库
👫全浏览器兼容
这里仅做基本功能代码展示,更详细的可自行去Day.js官网查看文档~
console.log("🎉", dayjs().year()); // 🎉 2023
console.log("🎉", dayjs().month() + 1); // 🎉 9
console.log("🎉", dayjs().date()); // 🎉 1
console.log("🎉", dayjs().hour()); // 🎉 14
console.log("🎉", dayjs().minute()); // 🎉 9
console.log("🎉", dayjs().second()); // 🎉 41
console.log("🎉", dayjs().format("YYYY-MM-DD HH:mm:ss")); // 🎉 2023-09-01 14:09:41
4️⃣. 写在最后
大家可以发挥想象力,将库二次封装使得更加符合自己项目的业务需求,不过我们项目对于时间格式的要求并木有那么复杂,我就不封装啦🤪,继续努力吧
如果您有任何问题、建议或反馈,欢迎在评论区留言📝,非常愿意听取您的声音。感谢您的阅读,期待与您在未来的博客分享中再次相会🥳!