/* 时间格式:2016-8-31 10:35:00 或 2016/8/31 10:35:00 */
var dateObj=dayCha('2016-8-17','2019-6-30') //执行方法,参数为时间,第二个时间未填默认为当前时间。
function dayCha(time, twoTime) {
time = time.replace(new RegExp("-", "gm"), "/");
if (twoTime) {
twoTime = twoTime.replace(new RegExp("-", "gm"), "/");
}
else {
twoTime = new Date();
}
// 计算比较日期
const getMaxMinDate = (time, twoTime, type) => {
let minTime = new Date(time).getTime() - new Date(twoTime).getTime() > 0 ? twoTime : time
let maxTime = new Date(time).getTime() - new Date(twoTime).getTime() > 0 ? time : twoTime
let maxDateDay = new Date(new Date(maxTime).getFullYear(), new Date(maxTime).getMonth() + 1, 0).getDate()
let maxMinDate = new Date(minTime).getDate() > maxDateDay ? maxDateDay : new Date(minTime).getDate()
let maxMinTong = null
if (type == 'month') {
maxMinTong = new Date(maxTime).getFullYear() + '/' + (new Date(minTime).getMonth() + 1) + '/' + maxMinDate + ' ' + new Date(minTime).toLocaleTimeString('chinese',{hour12:false})
} else {
maxMinTong = new Date(maxTime).getFullYear() + '/' + (new Date(maxTime).getMonth() + 1) + '/' + maxMinDate + ' ' + new Date(minTime).toLocaleTimeString('chinese',{hour12:false})
}
return {
minTime,
maxTime,
maxMinTong
}
}
// 相差年份
const getYear = (time, twoTime) => {
let oneYear = new Date(time).getFullYear()
let twoYear = new Date(twoTime).getFullYear()
// 计算出与最小日期的日时分相同的最大日期的值
// 如2016-8-17和2019-6-30,计算出来的maxMinTong为2019-8-17
const { minTime, maxTime, maxMinTong } = getMaxMinDate(time, twoTime, 'month')
// 计算相差多少年
let chaYear = Math.abs(oneYear - twoYear)
// 如果计算出的maxMinTong(如2019-8-17)大于了最大日期,则表示最后一年没有满,需要减一
if (new Date(maxMinTong).getTime() > new Date(maxTime).getTime()) {
chaYear--
}
return chaYear
}
const getMonthTong = (time, twoTime) => {
let oneMonth = new Date(time).getFullYear() * 12 + (new Date(time).getMonth() + 1)
let twoMonth = new Date(twoTime).getFullYear() * 12 + (new Date(twoTime).getMonth() + 1)
return Math.abs(oneMonth - twoMonth)
}
// 相差月份
const getMonth = (time, twoTime, value) => {
// 计算出与最小日期的日时分相同的最大日期的值
// 如2016-8-17和2019-6-30,计算出来的maxMinTong为2019-6-17
const { minTime, maxTime, maxMinTong } = getMaxMinDate(time, twoTime, 'day')
// 计算最小日期到maxMinTong(如2019-6-17)的月份,这样刚好对应月日
let chaMonth = getMonthTong(minTime, maxMinTong)
// 如果计算出来的maxMinTong(如2019-6-17)大于最大日期,则表示最后一月没有满,需要减一
if (new Date(maxMinTong).getTime() > new Date(maxTime).getTime()) {
chaMonth--
}
if (value) {
return chaMonth - value
} else {
return chaMonth
}
}
// 相差天数
const getDay = (time, twoTime, value) => {
let chaTime = Math.abs(new Date(time).getTime() - new Date(twoTime).getTime());
if (value) {
return parseInt(chaTime / 86400000) - value
} else {
return parseInt(chaTime / 86400000)
}
}
// 相差小时
const getHour = (time, twoTime, value) => {
let chaTime = Math.abs(new Date(time).getTime() - new Date(twoTime).getTime());
if (value) {
return parseInt(chaTime / 3600000) - value
} else {
return parseInt(chaTime / 3600000)
}
}
// 相差分钟
const getMinute = (time, twoTime, value) => {
let chaTime = Math.abs(new Date(time).getTime() - new Date(twoTime).getTime());
if (value) {
return parseInt(chaTime / 60000) - value
} else {
return parseInt(chaTime / 60000)
}
}
// 相差秒
const getSecond = (time, twoTime, value) => {
let chaTime = Math.abs(new Date(time).getTime() - new Date(twoTime).getTime());
if (value) {
return parseInt(chaTime / 1000) - value
} else {
return parseInt(chaTime / 1000)
}
}
// 相差年月日时分秒
const getDffeYMDHMS = (time, twoTime) => {
// 计算出与最小日期的日时分相同的最大日期的值
// 如2016-8-17和2019-6-30,计算出来的maxMinTong为2019-6-17
const { minTime, maxTime, maxMinTong } = getMaxMinDate(time, twoTime, 'day')
// 计算最小日期到(如:2019-6-17)的天数,这样算出来的天数刚好数足月的
let dffeDay1 = getDay(minTime, maxMinTong)
// 判断一下,如果计算出来的(如:2019-6-17)大于最后的日期(如2019-6-30)就需要减去(2019-6-30到2019-6-17的天数,否则不需要)
if (new Date(maxMinTong).getTime() > new Date(maxTime).getTime()) {
dffeDay1 = dffeDay1 - getDay((new Date(maxTime).getFullYear() + '/' + (new Date(maxTime).getMonth()) + '/' + new Date(minTime).getDate()), maxMinTong)
}
let dffeYear = getYear(time, twoTime)
let dffeMonth = getMonth(time, twoTime, dffeYear * 12)
let dffeDay = getDay(time, twoTime, dffeDay1)
let dffeHour = getHour(time, twoTime, getDay(time, twoTime) * 24)
let dffeMinute = getMinute(time, twoTime, (getDay(time, twoTime) * 24 * 60 + dffeHour * 60))
let dffeSecond = getSecond(time, twoTime, (getDay(time, twoTime) * 24 * 60 * 60 + dffeHour * 60 * 60 + dffeMinute * 60))
console.log(`年:${dffeYear},月:${dffeMonth},日:${dffeDay},时:${dffeHour},分:${dffeMinute},秒:${dffeSecond}`)
return { dffeYear, dffeMonth, dffeDay, dffeHour, dffeMinute, dffeSecond }
}
// 相差年月周日时分秒
const getDffeYMWDHMS = (time, twoTime) => {
// 计算出与最小日期的日时分相同的最大日期的值
const { minTime, maxTime, maxMinTong } = getMaxMinDate(time, twoTime, 'day')
let dffeDay1 = getDay(minTime, maxMinTong)
// 如果大于了,就需要减掉多余天数
if (new Date(maxMinTong).getTime() > new Date(maxTime).getTime()) {
dffeDay1 = dffeDay1 - getDay((new Date(maxTime).getFullYear() + '/' + (new Date(maxTime).getMonth()) + '/' + new Date(minTime).getDate()), maxMinTong)
}
let dffeYear = getYear(time, twoTime)
let dffeMonth = getMonth(time, twoTime, dffeYear * 12)
let dffeDayZong = getDay(time, twoTime, dffeDay1)
let dffeWeek = parseInt(dffeDayZong / 7)
let dffeDay = dffeDayZong - dffeWeek * 7
let dffeHour = getHour(time, twoTime, getDay(time, twoTime) * 24)
let dffeMinute = getMinute(time, twoTime, (getDay(time, twoTime) * 24 * 60 + dffeHour * 60))
let dffeSecond = getSecond(time, twoTime, (getDay(time, twoTime) * 24 * 60 * 60 + dffeHour * 60 * 60 + dffeMinute * 60))
console.log(`年:${dffeYear},月:${dffeMonth},周:${dffeWeek},日:${dffeDay},时:${dffeHour},分:${dffeMinute},秒:${dffeSecond}`)
return { dffeYear, dffeMonth, dffeWeek, dffeDay, dffeHour, dffeMinute, dffeSecond }
}
let chaYear = getYear(time, twoTime)
let chaMonth = getMonth(time, twoTime)
let chaDay = getDay(time, twoTime)
let chaHour = getHour(time, twoTime)
let chaMinute = getMinute(time, twoTime)
let chaSecond = getSecond(time, twoTime)
return {
chaYear, chaMonth, chaDay, chaHour, chaMinute, chaSecond,
getDffeYMDHMS: getDffeYMDHMS(time, twoTime),
getDffeYMWDHMS: getDffeYMWDHMS(time, twoTime)
}
}
版权声明:本文为qq_40591925原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。