这里记录一些工作中用到的关于日期操作的方法。
1.获取两个日期之间都有哪些天数
第一种方式
getTimeList() {
console.log(this.condition.startTime);
console.log(this.condition.endTime);
let dates = [];
let arr = [];
// 设置两个日期UTC时间
let db = new Date(this.condition.startTime); // 开始日期
let de = new Date(this.condition.endTime); // 结束日期
// 获取两个日期GTM时间
let s = db.getTime() - 24 * 60 * 60 * 1000;
let d = de.getTime() - 24 * 60 * 60 * 1000;
// 获取到两个日期之间的每一天的毫秒数
for (var i = s; i <= d; ) {
i = i + 24 * 60 * 60 * 1000;
arr.push(parseInt(i));
}
// 获取每一天的时间 YY-MM-DD
for (var j in arr) {
let time = new Date(arr[j]);
let year = time.getFullYear(time);
let mouth =
time.getMonth() + 1 >= 10
? time.getMonth() + 1
: "0" + (time.getMonth() + 1);
let day = time.getDate() >= 10 ? time.getDate() : "0" + time.getDate();
let YYMMDD = year + "-" + mouth + "-" + day;
dates.push(YYMMDD);
}
this.timeList = dates;
console.log(this.timeList);
}
第二种方式
getTimeList() {
console.log(this.condition.startTime);
console.log(this.condition.endTime);
const timesArr = [];
const startTime = new Date(this.condition.startTime);
const endTime = new Date(this.condition.endTime);
const days = (endTime - startTime) / (1 * 24 * 60 * 60 * 1000);
if (days != 0) {
for (let i = 0; i <= days; i++) {
const time = moment(startTime).add(i, "days").format("YYYY-MM-DD");
timesArr.push(time);
}
}
console.log(timesArr);
return timesArr;
}
这个方法只可以传入2025-05-02,2026-07-01这种到日的日期,不可以传入2025-05,2025-06这种到月份的日期,会有错误的地方,就更不能传2025这样只有年份的日期了。
传2025-05-02,2026-07-01这种到日的日期效果成功:
传2025-05,2025-06这种到月份的日期效果失败,因为都不知道具体到哪一天:
如果想这么传,代表获取五月份六月份的日期也比较简单实现,自己手动拼上日期就是了2025-05-01,2025-06-30。
2.获取两个日期之间都有哪些月份
getTimeMonthList() {
console.log(this.condition.startTime);
console.log(this.condition.endTime);
let dates = [];
let min = new Date(new Date(this.condition.startTime).setDate(1));
let max = new Date(new Date(this.condition.endTime).setDate(1));
let curr = min;
do {
let month = new Date(curr).getMonth() + 1;
let t = "";
if (month < 10) {
t = "0" + month;
} else t = month;
let str = curr.getFullYear() + "-" + t;
dates.push(str);
if (month == 12) {
curr.setFullYear(new Date(curr).getFullYear() + 1);
curr.setMonth(0);
} else curr.setMonth(month);
} while (curr <= max);
this.timeList = dates;
console.log(this.timeList);
}
这个方法你可以传入2025-05,2025-12这种到月份的日期,也可以传入2025-05-02,2026-07-01这种到日的日期,但是不可以传入2025,2026这种只有年份的日期,当然更好就传入2025-05,2025-12这种到月份的日期。
传2025-05,2025-12这种到月份的日期效果成功:
传2025-05-02,2026-07-01这种到日的日期效果成功:
传2025,2026这种只有年份的日期效果失败,因为都不知道具体到哪个月:
如果想这么传,代表获取2025年和2026年的月份也比较简单实现,自己手动拼上日期就是了2025-01,2026-12。
3.获取目标月份都有哪些天数
getMonthTimeList() {
console.log(this.condition.dataTime);
// 获取目标时间
let date = new Date(this.condition.dataTime);
// 获取目标月份(实际月份需要加1)
let currentMonth = date.getMonth() + 1;
//当小于10->01,02,03...
if (currentMonth < 10) {
currentMonth = "0" + currentMonth;
}
// 获取目标日期的年份
let currentYear = date.getFullYear();
// 获取目标月份有多少天
let currentMonthDays = new Date(currentYear, currentMonth, 0).getDate();
// 目标月份所有日期集合
let dates = [];
for (let day = 1; day <= currentMonthDays; day++) {
// 年月日(yyyy-MM-dd)
let dateItem =
currentYear + "-" + currentMonth + "-" + (day < 10 ? "0" + day : day);
dates.push(dateItem);
}
this.timeList = dates;
console.log(this.timeList);
}
这个方法可以传入2025-05这种到月份的日期,也可以传入2025-05-01这种到日的日期,因为都可以获取到具体月份,就不一一举例了。
4.获取目标年份都有哪几个月且每个月都有哪些日期
function geYearTimeList() {
console.log(this.condition.dataTime);
const getDaysCount = (year, month) => {
return new Date(year, month + 1, 0).getDate();
};
const addZero = (num) => {
return num < 10 ? "0" + num : num;
};
let dates = [];
let year = new Date(this.condition.dataTime).getFullYear();
let date = new Date(year, 0, 1);
while (date.getFullYear() === year) {
let month = date.getMonth();
let daysCount = getDaysCount(date.getFullYear(), month);
dates.push({
month: month + 1, //月份
dayList: [], //所有天数
});
for (let day = 1; day <= daysCount; day++) {
dates[month].dayList.push(
year + "-" + addZero(month + 1) + "-" + addZero(day)
);
}
date.setDate(date.getDate() + daysCount); //下个月的第一天
}
this.timeList = dates;
console.log(this.timeList);
}