一、获取日期和年份之间的关系
此方法不完善,后续工作中没有用过,也就没再去弄了
/** *
* 理解方式:
* (1)计算某一年份和某一日期间隔多少天(两个参数都必须正确传入);
* (2)计算当前日期在当年第多少天(两个参数都可不传);
* (3)某一年份距离当前日期多少天(第一个参数需要传null 或者 false,第二个正确传入年份)
* (4)某一日期在当年的第多少天(第一个参数传入正确日期,第二个不传)
* @param {*日期} date, 传入的日期,不传则使用当前日期
* @param {*年份} year, 传入的年份,不传则使用当前年份
* PS:如果传入日期的年份大于传入的年份,则是年份距离日期多少天,否则是传入日期距离年份多少天
**/
// 拓展(未做):
// 1.第一个传日期,第二个不传:传入日期距当前日期间隔天数(与上面第四点冲突)
// 2.第一个传日期,第二个也传日期:两个日期间隔多少天(如果做了,第三个方法也可再简化一点)
// 3.第一个传数字年份,第二个不传:当前日期距离传入年份多少天
// 4.第一个传数字年份,第二个传日期:也是同第3点一样
// 5.第一个传数字年份,第二个也传数字年份:两个年份之间的总天数
// 6.第一个传null或者false,第二个传日期:new Date() 的日期和传入日期间隔多少天
format.getDayOfYear = function (date, year) {
const nowDate = date && new Date(date).getFullYear() && new Date(date).getFullYear() !== 1970 ? new Date(date) : new Date()
let dateYear = nowDate.getFullYear()
year = year || dateYear
let num = 0
// 处理传入日期在传入日期年份第多少天
const m = nowDate.getMonth()
const d = nowDate.getDate()
// 循环累加天数
for (let i = 0; i <= m; i++) {
let day = new Date(dateYear, i, 0).getDate()
num += i === m ? d : day
}
// 如果传入日期的年份大于传入的年份,则是年份距离日期多少天
if (dateYear >= year) {
for (let y = year; y < dateYear; y++) {
num += ((y % 4 === 0 && y % 100 !== 0) || (y % 400 === 0)) ? 366 : 365
}
} else {
// 否则是传入日期距离年份多少天
let moreDay = 0
for (let y = dateYear; y < year; y++) {
moreDay += ((y % 4 === 0 && y % 100 !== 0) || (y % 400 === 0)) ? 366 : 365
}
num = moreDay - num
}
return num
}
二、获取两个年份之间所有年的总:月数和天数,每月的天数,每年的天数
/**
* 获取两个年份之间所有年的总:月数和天数,每月的天数,每年的天数
* @param {*年份1} year1 不传则默认当年
* @param {*年份2} year2 非必传
* @param {*所有的月和天数据} list,默认[]
* @param {*按年份的月和天数据} listPage,默认{}
* @param {*总共多少年} years
* @param {*总共多少月} months,默认0
* @param {*每年多少天和总天数} days,默认0
*/
format.getDateBetween = function (year1, year2) {
// 处理年份
year1 = (year1 || new Date().getFullYear()) * 1
year2 = year2 ? year2 * 1 : year1
// 处理年份的大小顺序
let newYear = year1
if (year1 > year2) {
year1 = year2
year2 = newYear
}
// 获取所有月,日
let result = {
list: [],
listPage: {},
years: year2 - year1 + 1,
months: 0,
days: { count: 0 }
}
// 循环得到需要的信息
for (let i = year1; i <= year2; i++) {
result.listPage[i] = []
result.days[i] = 0
for (let m = 1; m <= 12; m++) {
let date = new Date(i, m, 0).getDate()
result.list.push({ month: m, day: date })
result.listPage[i].push({ month: m, day: date })
result.days[i] += date
result.days.count += date
}
result.months += 12
}
return result
}
三、计算两个日期之间的天数、两个日期各自在当年第多少天、及其两年之间的总天数,基于以上第一个方法
此方法需要用到上述第一个方法
/**
* 计算两个日期之间的天数、两个日期各自在当年第多少天、及其两年之间的总天数,
* @param {*日期1} date1
* @param {*日期2} date2
* @param {*日期之间的天数} dayNum,默认0
* @param {*开始日期在当年第多少天} startNum,默认0
* @param {*结束日期在当年第多少天} endNum,默认0
* @param {*总天数} alldays,默认0,上面第二个方法也有计算总天数,看情况选择
*/
format.computedYearDay = function (date1, date2) {
let dayObj = { dayNum: 0, startNum: 0, endNum: 0, alldays: 0 }
if (date1 && date2) {
// 重新设置日期大小顺序
const newYear = date1
if (date1.localeCompare(date2) === 1) {
date1 = date2
date2 = newYear
}
const ksYears = new Date(date1).getFullYear()
const jsYears = new Date(date2).getFullYear()
// 两年之间的总天数
let alldays = 0
// 结束年份总天数
let jsDays = ((jsYears % 4 === 0 && jsYears % 100 !== 0) || (jsYears % 400 === 0)) ? 366 : 365
for (let i = ksYears; i <= jsYears; i++) {
alldays += ((i % 4 === 0 && i % 100 !== 0) || (i % 400 === 0)) ? 366 : 365
}
// 分别获取两个日期在当年第多少天
const startNum = format.getDayOfYear(date1)
const endNum = format.getDayOfYear(date2)
// 计算间隔多少天
let dayNum = alldays - (jsDays - endNum + startNum)
dayObj = { dayNum, startNum, endNum, alldays: alldays }
}
return dayObj
}