@ivujs/i-utils
Version:
前端模块化 JavaScript 工具库
1,263 lines (1,150 loc) • 37.8 kB
JavaScript
import { isEmpty, isNull, isString, isDate, isInteger } from '../validate/index.mjs';
import { parseInt } from '../number/index.mjs';
import { DATE } from '../constants/date.mjs';
/* 快捷日期 */
/**
* 今天
*@returns {String} 返回日期字符串
*/
function today() {
return getDate();
}
/**
* 昨天
* @returns {String} 返回日期字符串
*/
function yesterday() {
return formatDate(addDate(new Date(), -1));
}
/**
* 明天
*@returns {String} 返回日期字符串
*/
function tomorrow() {
return formatDate(addDate(new Date(), +1));
}
/**
* 上周(7天前日期)
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function lastWeek(date = new Date()) {
return formatDate(addDate(date, -7));
}
/**
* 下周(7天后日期)
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function nextWeek(date = new Date()) {
return formatDate(addDate(date, +7));
}
/**
* 上个月(30天前日期)
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function lastMonth(date = new Date()) {
return formatDate(addDate(date, -30));
}
/**
* 下个月(30天后日期)
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function nextMonth(date = new Date()) {
return formatDate(addDate(date, +30));
}
/**
* 上一年(365天前日期)
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function lastYear(date = new Date()) {
return formatDate(addDate(date, -365));
}
/**
* 下一年(365天后日期)
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function nextYear(date = new Date()) {
return formatDate(addDate(date, +365));
}
/* 判断当前日期 */
/**
* 是否为上午
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isAM(date = new Date()) {
return date.getHours() < 12;
}
/**
* 是否为下午
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isPM(date = new Date()) {
return date.getHours() >= 12;
}
/**
* 是否为今天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isToday(date = new Date()) {
// 此刻日期
let nowDate = new Date();
// 判断日期
return ["getFullYear", "getMonth", "getDate"].every((i) => nowDate[i]() === date[i]());
}
/**
* 是否为昨天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isYesterday(date = new Date()) {
// 计算时间差
let startTime = date.getTime();
let nowTime = Date.now();
let diffTime = nowTime - startTime;
let diffDay = parseInt(diffTime / (1000 * 60 * 60 * 24));
return diffDay === 1;
}
/**
* 是否为前天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isBeforeYesterday(date = new Date()) {
// 计算时间差
let startTime = date.getTime();
let nowTime = Date.now();
let diffTime = nowTime - startTime;
let diffDay = parseInt(diffTime / (1000 * 60 * 60 * 24));
return diffDay === 2;
}
/**
* 是否为明天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isTomorrow(date = new Date()) {
// 计算时间差
let startTime = date.getTime();
let nowTime = Date.now();
let diffTime = startTime - nowTime;
let diffDay = parseInt(diffTime / (1000 * 60 * 60 * 24));
return diffDay === 1;
}
/**
* 是否为后天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isAfterTomorrow(date = new Date()) {
// 计算时间差
let startTime = date.getTime();
let nowTime = Date.now();
let time = startTime - nowTime;
let diffDay = parseInt(time / (1000 * 60 * 60 * 24));
return diffDay === 2;
}
/**
* 是否为工作日
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isWorkday(date = new Date()) {
let dayOfWeek = getDayOfWeek(date);
return dayOfWeek !== 6 && dayOfWeek !== 7;
}
/**
* 是否为周末(周六和周日)
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isWeekend(date = new Date()) {
let dayOfWeek = getDayOfWeek(date);
return dayOfWeek === 6 || dayOfWeek === 7;
}
/**
* 是否为本周第一天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isFirstDayOfWeek(date = new Date()) {
return getDayOfWeek(date) === 1;
}
/**
* 是否为本周最后一天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isLastDayOfWeek(date = new Date()) {
return getDayOfWeek(date) === 7;
}
/**
* 是否为本月第一天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isFirstDayOfMonth(date = new Date()) {
return getDayOfMonth(date) === 1;
}
/**
* 是否为本月最后一天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isLastDayOfMonth(date = new Date()) {
return getDayOfMonth(date) === getDaysOfMonth(date);
}
/**
* 是否为本年第一天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isFirstDayOfYear(date = new Date()) {
return getDayOfYear(date) === 1;
}
/**
* 是否为本年最后一天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isLastDayOfYear(date = new Date()) {
return getDayOfYear(date) === getDaysOfYear(date);
}
/* 判断年 */
/**
* 是否为闰年
* @description 闰年366天,平年365天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isLeapYear(date = new Date()) {
let year = date.getFullYear();
return (year % 100 !== 0 && year % 4 === 0) || year % 400 === 0;
}
/**
* 是否为平年
* @description 闰年366天,平年365天
* @param {Date} date 日期参数,默认当前日期
* @returns {Boolean} 返回结果
*/
function isCommonYear(date = new Date()) {
return !isLeapYear(date);
}
/* 比较日期区间 */
/**
* 是否在日期之前
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期,默认当前日期
* @returns {Boolean} 返回结果
*/
function isBefore(startDate, endDate = new Date()) {
// 计算时间差
let startTime = startDate.getTime();
let endTime = endDate.getTime();
let diffTime = startTime - endTime;
return diffTime < 0;
}
/**
* 是否在日期之后
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期,默认当前日期
* @returns {Boolean} 返回结果
*/
function isAfter(startDate, endDate = new Date()) {
// 计算时间差
let startTime = startDate.getTime();
let endTime = endDate.getTime();
let diffTime = startTime - endTime;
return diffTime > 0;
}
/**
* 是否在两个日期之间
* @param {Date} date 要比较的日期
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Boolean} 返回结果
*/
function isBetween(date, startDate, endDate) {
let time = date.getTime();
let startTime = startDate.getTime();
let endTime = endDate.getTime();
return time > startTime && time < endTime;
}
/* 日期是否相同 */
/**
* 两个日期是否为同一天
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Boolean} 返回结果
*/
function isSame(startDate, endDate) {
return ["getFullYear", "getMonth", "getDate"].every((i) => startDate[i]() === endDate[i]());
}
/**
* 两个日期是否为同一周
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Boolean} 返回结果
*/
function isSameWeek(startDate, endDate) {
let diffDate1 = startDate.getTime() / (24 * 60 * 60 * 1000);
let diffDate2 = endDate.getTime() / (24 * 60 * 60 * 1000);
return parseInt((diffDate1 + 4) / 7) === parseInt((diffDate2 + 4) / 7);
}
/**
* 两个日期是否为同一个月
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Boolean} 返回结果
*/
function isSameMonth(startDate, endDate) {
return ["getFullYear", "getMonth"].every((i) => startDate[i]() === endDate[i]());
}
/**
* 两个日期是否为同一年
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Boolean} 返回结果
*/
function isSameYear(startDate, endDate) {
return ["getFullYear"].every((i) => startDate[i]() === endDate[i]());
}
/* 比较两个日期相同 或 之前/之后 */
/**
* 两个日期是否相同或之前
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Boolean} 返回结果
*/
function isSameOrBefore(startDate, endDate) {
return isSame(startDate, endDate) || isBefore(startDate, endDate);
}
/**
* 两个日期是否相同或之后
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Boolean} 返回结果
*/
function isSameOrAfter(startDate, endDate) {
return isSame(startDate, endDate) || isAfter(startDate, endDate);
}
/* 获取 日期/时间戳/周/季度 */
/**
* 获得此刻的日期
* @returns {Date} 返回日期
*/
function getNow() {
return new Date();
}
/**
* 获得当前日期字符串
* @param {Date} date 日期参数,默认当前日期
* @param {String} format 日期字符串格式
* @returns {String} 返回日期字符串
*/
function getDate(date = new Date(), format = "yyyy-MM-dd") {
return formatDate(date, format);
}
/**
* 获得当前日期时间字符串
* @param {Date} date 日期参数,默认当前日期
* @param {String} format 日期时间字符串格式
* @returns {String} 返回日期时间字符串
*/
function getDateTime(date = new Date(), format = "yyyy-MM-dd HH:mm:ss") {
return formatDate(date, format);
}
/**
* 获取当前时间戳
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回时间戳
*/
function getTimestamp(date = new Date()) {
return date.getTime();
}
/**
* 获取当前Unix时间戳
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回Unix时间戳
*/
function getUnixTimestamp(date = new Date()) {
return Math.round(date / 1000);
}
/**
* 获得当前日期的对象形式
* @param {Date} date 日期参数,默认当前日期
* @returns {Object} 返回日期的对象形式
*/
function getDateObject(date = new Date()) {
return {
year: date.getFullYear(), // 年
month: date.getMonth() + 1, // 月
date: date.getDate(), // 日
hours: date.getHours(), // 时
minutes: date.getMinutes(), // 分
seconds: date.getSeconds(), // 秒
milliseconds: date.getMilliseconds(), // 毫秒
};
}
/**
* 获得当前日期的数组形式
* @param {Date} date 日期参数,默认当前日期
* @returns {Object} 返回日期的数组形式
*/
function getDateArray(date = new Date()) {
return Object.entries(getDateObject(date)).map(([key, value]) => value);
}
/**
* 获得当前日期是周几
* @param {Date} date 日期参数,默认当前日期
* @param {String} format 周格式化结果:E:如“日”,EE:如“周日”, EEE:如“星期日”;默认为E,为空则返回数字
* @param {String} lang 语言zh和en,默认zh
* @returns {Number,String} 返回周几,会根据语言返回
*/
function getWeek(date = new Date(), format = "E", lang = "zh") {
// 根据格式化和语言返回对应的周
if (format === "E") {
return DATE.WEEK[lang].MINI[date.getDay()];
} else if (format === "EE") {
return DATE.WEEK[lang].SHORT[date.getDay()];
} else if (format === "EEE") {
return DATE.WEEK[lang].FULL[date.getDay()];
} else {
return getDayOfWeek(date);
}
}
/**
* 获得当前日期是第几季度
* @param {Date} date 日期参数,默认当前日期
* @param {String} format 季度格式化结果:Q:如“一”, QQ:如“一季度”;QQQ:如“第一季度”;默认为Q,为空则返回数字
* @param {String} lang 语言zh和en,默认zh
* @returns {Number,String} 返回第几季度,会根据语言返回
*/
function getQuarter(date = new Date(), format = "Q", lang = "zh") {
// 根据格式化和语言返回对应的周
let quarterNum = Number(Math.floor((date.getMonth() + 3) / 3));
if (format === "Q") {
return DATE.QUARTER[lang].MINI[quarterNum - 1];
} else if (format === "QQ") {
return DATE.QUARTER[lang].SHORT[quarterNum - 1];
} else if (format === "QQQ") {
return DATE.QUARTER[lang].FULL[quarterNum - 1];
} else {
return quarterNum;
}
}
/* 当前日期是所在 周/月/年 的第几天 */
/**
* 获得当前日期是所在周的第几天
* @param {Date} date 日期参数,默认当前日期
* @returns {Number|String} 返回天数
*/
function getDayOfWeek(date = new Date()) {
return [7, 1, 2, 3, 4, 5, 6][date.getDay()];
}
/**
* 获得当前日期是所在月的第几天
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回天数
*/
function getDayOfMonth(date = new Date()) {
return date.getDate();
}
/**
* 获得当前日期是所在年的第几天
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回天数
*/
function getDayOfYear(date = new Date()) {
return Math.ceil((date - new Date(date.getFullYear().toString())) / (24 * 60 * 60 * 1000)) + 1;
}
/* 当前日期的周是所在 月/年 的第几周 */
/**
* 获得当前日期是所在月的第几周
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回周数
*/
function getWeekOfMonth(date = new Date()) {
return Math.ceil((date.getDate() + 6 - getDayOfWeek(date)) / 7);
}
/**
* 获得当前日期是所在年的第几周
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回周数
*/
function getWeekOfYear(date = new Date()) {
let startDate = new Date(date.getFullYear(), 0, 1);
let startDay = getDayOfWeek(startDate);
let diff = Math.round((date - startDate) / (24 * 60 * 60 * 1000));
return Math.ceil((diff + startDay) / 7);
}
/* 当前日期所在 周/月/年 共几天 */
/**
* 获得当前日期所在的周共几天
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回天数
*/
function getDaysOfWeek(date = new Date()) {
return 7;
}
/**
* 获得当前日期所在的月共几天
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回天数
*/
function getDaysOfMonth(date = new Date()) {
return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
}
/**
* 获得当前日期所在的年共几天
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回天数
*/
function getDaysOfYear(date = new Date()) {
return isLeapYear(date) ? 366 : 365;
}
/* 当前周所在 月/年 共几周 */
/**
* 获得当前日期是所在月的第几周
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回周数
*/
function getWeeksOfMonth(date = new Date()) {
let startDate = new Date(date.getFullYear(), 0, 1);
let startDay = getDayOfWeek(startDate);
let fullDays = isLeapYear(date) ? 366 : 365;
if (startDay === 1) {
return Math.ceil(fullDays / 7);
} else {
return Math.ceil((fullDays - 7 + startDay) / 7);
}
}
/**
* 获得当前日期是所在年的第几周
* @param {Date} date 日期参数,默认当前日期
* @returns {Number} 返回周数
*/
function getWeeksOfYear(date = new Date()) {
let startDate = new Date(date.getFullYear(), 0, 1);
let startDay = getDayOfWeek(startDate);
let fullDays = isLeapYear(date) ? 366 : 365;
if (startDay === 1) {
return Math.ceil(fullDays / 7);
} else {
return Math.ceil((fullDays - 7 + startDay) / 7);
}
}
/* 当前日期所在 周/月/年 的 第一天/最后一天/所有天数数组 */
/**
* 获得当前日期所在周的第一天
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function getFirstDateOfWeek(date = new Date()) {
let weekDay = getDayOfWeek(date);
date.setDate(date.getDate() - weekDay + 1);
return formatDate(date);
}
/**
* 获得当前日期所在周的最后一天
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function getLastDateOfWeek(date = new Date()) {
let weekDay = getDayOfWeek(date);
date.setDate(date.getDate() + (7 - weekDay));
return formatDate(date);
}
/**
* 获取当前日期所在周的所有日期
*/
function getFullDateOfWeek(date = new Date()) {
let array = [];
// 获得当前日期是本周几
let dayOfWeek = date.getDay();
// 根据当前日期获取本周一
let firstDateOfWeek = new Date();
firstDateOfWeek.setDate(date.getDate() - (dayOfWeek === 0 ? 6 : dayOfWeek - 1));
// 遍历本周日期
for (let i = 0; i < 7; i++) {
let currentDate = new Date(firstDateOfWeek);
currentDate.setDate(currentDate.getDate() + i);
array.push(formatDate(currentDate));
}
return array;
}
/**
* 获得当前日期所在月的第一天
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function getFirstDateOfMonth(date = new Date()) {
date.setDate(1);
return formatDate(date);
}
/**
* 获得当前日期所在月的最后一天
* @param {Date} date 日期参数,默认当前日期
* @returns {String} 返回日期字符串
*/
function getLastDateOfMonth(date = new Date()) {
return formatDate(new Date(date.getFullYear(), date.getMonth() + 1, 0));
}
/**
* 获取当前日期所在月的所有日期
*/
function getFullDateOfMonth(date = new Date()) {
let array = [];
// 获得本月第一天
let firstDateOfMonth = new Date(date.getFullYear(), date.getMonth(), 1);
// 获得本月最后一天
let lastDateOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0);
// 遍历本月日期
for (let i = 0; i < lastDateOfMonth.getDate(); i++) {
let currentDate = new Date(firstDateOfMonth);
currentDate.setDate(firstDateOfMonth.getDate() + i);
array.push(currentDate);
}
return array;
}
/**
* 获取当前日期所在年的第一天
*/
function getFirstDateOfYear(date = new Date()) {
return new Date(date.getFullYear(), 0, 1);
}
/**
* 获取当前日期所在年的最后一天
*/
function getLastDateOfYear(date = new Date()) {
return new Date(date.getFullYear(), 11, 31);
}
/**
* 获取当前日期所在年的所有日期
*/
function getFullDateOfYear(date = new Date()) {
let array = [];
// 获得本年第一天
let firstDateOfYear = new Date(date.getFullYear(), 0, 1);
// 获得本年一共多少天
let daysOfYear = getDaysOfYear();
// 遍历本年日期
for (let i = 0; i < daysOfYear; i++) {
let currentDate = new Date(firstDateOfYear);
currentDate.setDate(firstDateOfYear.getDate() + i);
array.push(currentDate.toLocaleDateString());
}
return array;
}
/* 计算两个日期相差 */
/**
* 计算两个日期相差的天数,不满一天为0
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Number} 返回两个日期相差的天数,结果为正数或者负数
*/
function getDiffDay(startDate, endDate) {
if (isEmpty(startDate) || isEmpty(endDate)) return 0;
let diff = (endDate - startDate) / (24 * 60 * 60 * 1000);
// 返回
return diff >= 0 ? Math.abs(diff) : diff;
}
/**
* 计算两个日期相差的周数,不满一周为0
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Number} 返回两个日期相差的周数,结果为正数或者负数
*/
function getDiffWeek(startDate, endDate) {
if (isEmpty(startDate) || isEmpty(endDate)) return 0;
let diff = (endDate - startDate) / (7 * 24 * 60 * 60 * 1000);
// 返回
return diff >= 0 ? Math.abs(diff) : diff;
}
/**
* 计算两个日期相差的月数,不满一月为0
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Number} 返回两个日期相差的月数,结果为正数或者负数
*/
function getDiffMonth(startDate, endDate) {
if (isEmpty(startDate) || isEmpty(endDate)) return 0;
let diff = (startDate - endDate) / (30 * 24 * 60 * 60 * 1000);
// 返回
return diff >= 0 ? Math.abs(diff) : diff;
}
/**
* 计算两个日期相差的年数,不满一年为0
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Number} 返回两个日期相差的年数,结果为正数或者负数
*/
function getDiffYear(startDate, endDate) {
if (isEmpty(startDate) || isEmpty(endDate)) return 0;
let diff = (endDate - startDate) / (12 * 30 * 24 * 60 * 60 * 1000);
// 返回
return diff >= 0 ? Math.abs(diff) : diff;
}
/* 获得两个日期之间 年月日/年月/年 数组 */
/**
* 获得两个日期之间的年月日数组
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Array} 返回年月日数组
*/
function getBetweenDates(startDate, endDate) {
if (isEmpty(startDate) || isEmpty(endDate)) return [];
// 计算
let array = [];
while (endDate - startDate >= 0) {
let year = startDate.getFullYear(),
month = _digit(startDate.getMonth() + 1),
day = _digit(startDate.getDate());
// 加入数组
array.push(year + "-" + month + "-" + day);
// 更新日期
startDate.setDate(startDate.getDate() + 1);
}
return array;
}
/**
* 获得两个日期之间的年月数组
* @description 支持:日期字符串,日期对象,时间戳,Unix时间戳
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Array} 返回年月数组
*/
function getBetweenMonths(startDate, endDate) {
if (isEmpty(startDate) || isEmpty(endDate)) return [];
// 计算
let array = [];
// 获取时间对象
let min = new Date();
let max = new Date();
// 设置起始时间
min.setFullYear(startDate.getFullYear(), startDate.getMonth() + 1);
// 设置结束时间
max.setFullYear(endDate.getFullYear(), endDate.getMonth() + 1);
// 复制一份起始时间对象
let curr = min;
// 定义字符串
let str = "";
// 起始时间在结束时间之前
while (curr <= max) {
// 获取此时间的月份
let month = curr.getMonth();
// 如果月份为0,也就是代表12月份
if (month === 0) {
str = curr.getFullYear() - 1 + "-" + 12;
} else {
// 正常月份
str = curr.getFullYear() + "-" + _digit(month);
}
// 将此年月加入数组
array.push(str);
// 更新此时间月份
curr.setMonth(month + 1);
}
return array;
}
/**
* 获得两个日期之间的年数组
* @param {Date} startDate 开始日期
* @param {Date} endDate 结束日期
* @returns {Array} 返回年数组
*/
function getBetweenYears(startDate, endDate) {
if (isEmpty(startDate) || isEmpty(endDate)) return [];
// 计算
let array = [];
while (endDate - startDate >= 0) {
let year = startDate.getFullYear();
// 加入数组
array.push(year);
// 更新日期
startDate.setFullYear(startDate.getFullYear() + 1);
}
return array;
}
/* 过去时间和剩余时间的显示 */
/**
* 获得过去时间的字符串显示
* @description 例如:刚刚,1分钟前,1小时前等
* @param {Date} date 日期参数
* @param {String} lang 语言zh和en,默认zh
* @returns {String} 返回字符串
*/
function getPastTime(date, lang = "zh") {
if (isNull(date)) return "--";
// 计算时间差
let startTime = date.getTime();
let currentTime = Date.now();
let time = currentTime - startTime;
// 年月日时分
let year = parseInt(time / (1000 * 60 * 60 * 24 * 30 * 12));
let month = parseInt(time / (1000 * 60 * 60 * 24 * 30));
let day = parseInt(time / (1000 * 60 * 60 * 24));
let hour = parseInt(time / (1000 * 60 * 60));
let min = parseInt(time / (1000 * 60));
// 返回结果
if (year) {
return year + DATE.PASS_TIME[lang].YEAR;
} else if (month) {
return month + DATE.PASS_TIME[lang].MONTH;
} else if (day) {
if (day === 1) {
return DATE.PASS_TIME[lang].YESTERDAY;
} else if (day === 2) {
return DATE.PASS_TIME[lang].BEFORE_YESTERDAY;
} else {
return day + DATE.PASS_TIME[lang].DAY;
}
} else if (hour) {
if (hour > 12) {
return DATE.PASS_TIME[lang].TODAY;
} else {
return hour + DATE.PASS_TIME[lang].HOUR;
}
} else if (min) {
return min + DATE.PASS_TIME[lang].MINUTE;
} else {
return DATE.PASS_TIME[lang].JUST;
}
}
/**
* 获得剩余时间的字符串显示
* @description 例如:1天10小时20分钟30秒
* @param {Date} date 日期参数
* @param {String} lang 语言zh和en,默认zh
* @returns {String} 返回字符串
*/
function getOverTime(date, lang = "zh") {
if (isNull(date)) return "--";
// 计算
let startDate = new Date(); // 开始时间
let t = date.getTime() - startDate.getTime(); // 时间差
let d = 0,
h = 0,
m = 0,
s = 0;
if (t >= 0) {
d = Math.floor(t / 1000 / 3600 / 24);
h = Math.floor((t / 1000 / 60 / 60) % 24);
m = Math.floor((t / 1000 / 60) % 60);
s = Math.floor((t / 1000) % 60);
}
return `${d}${DATE.OVER_TIME[lang].DAY} ${h}${DATE.OVER_TIME[lang].HOUR} ${m}${DATE.OVER_TIME[lang].MINUTE} ${s}${DATE.OVER_TIME[lang].SECOND}`;
}
/* 通过日期获得 年龄、星座和生肖 */
/**
* 通过日期获得年龄
* @param {Date} date 日期参数
* @returns {Number} 返回周岁年龄
*/
function getAge(date) {
let age = 0;
// 传参日期
let dateArray = formatDate(date).split("-");
let birthYear = Number(dateArray[0]);
let birthMonth = Number(dateArray[1]);
let birthDay = Number(dateArray[2]);
// 当前的日期
let nowDate = new Date();
let nowYear = nowDate.getFullYear(),
nowMonth = nowDate.getMonth() + 1,
nowDay = nowDate.getDate();
// 出生年份需要小于当年,否则是0岁
let diffAge = nowYear - birthYear;
if (diffAge > 0) {
let diffMonth = nowMonth - birthMonth;
let diffDay = nowDay - birthDay;
if (diffMonth === 0) {
if (diffDay < 0) {
age = diffAge - 1;
} else {
age = diffAge;
}
} else {
if (diffMonth < 0) {
age = diffAge - 1;
} else {
age = diffAge;
}
}
}
// 返回周岁年龄
return age;
}
/**
* 通过日期获得星座
* @param {Date} date 日期参数
* @param {String} lang 语言zh和en,默认zh
* @returns {String} 返回星座
*/
function getZodiac(date, lang = "zh") {
if (isNull(date)) return "";
// 计算
let days = [20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22];
let month = date.getMonth() + 1;
let day = date.getDate();
return day < days[month - 1] ? DATE.ZODIAC[lang][month - 1] : DATE.ZODIAC[lang][month];
}
/**
* 通过日期获得生肖
* @param {Date} date 日期参数
* @param {String} lang 语言zh和en,默认zh
* @returns {String} 返回生肖
*/
function getChineseZodiac(date, lang = "zh") {
if (isNull(date)) return "";
// 计算
let year = date.getFullYear();
if (year < 1900) {
return "未知";
}
return DATE.CHINESE_ZODIAC[lang][(year - 1900) % DATE.CHINESE_ZODIAC[lang].length];
}
/* 计算日期加减 年,月,日,时,分,秒,周,季度 */
/**
* 日期加减年
* @param {Date} date 日期参数,默认当前日期
* @param {Number} num 加减数量,用正数和负数表示;默认+1
* @returns {Date} 返回加减后的日期
*/
function addYear(date = new Date(), num = +1) {
date.setFullYear(date.getFullYear() + num);
return date;
}
/**
* 日期加减月
* @param {Date} date 日期参数,默认当前日期
* @param {Number} num 加减数量,用正数和负数表示;默认+1
* @returns {Date} 返回加减后的日期
*/
function addMonth(date = new Date(), num = +1) {
date.setMonth(date.getMonth() + num);
return date;
}
/**
* 日期加减天
* @param {Date} date 日期参数,默认当前日期
* @param {Number} num 加减数量,用正数和负数表示;默认+1
* @returns {Date} 返回加减后的日期
*/
function addDate(date = new Date(), num = +1) {
date.setDate(date.getDate() + num);
return date;
}
/**
* 日期加减小时
* @param {Date} date 日期参数,默认当前日期
* @param {Number} num 加减数量,用正数和负数表示;默认+1
* @returns {Date} 返回加减后的日期
*/
function addHours(date = new Date(), num = +1) {
date.setHours(date.getHours() + num);
return date;
}
/**
* 日期加减分钟
* @param {Date} date 日期参数,默认当前日期
* @param {Number} num 加减数量,用正数和负数表示;默认+1
* @returns {Date} 返回加减后的日期
*/
function addMinutes(date = new Date(), num = +1) {
date.setMinutes(date.getMinutes() + num);
return date;
}
/**
* 日期加减秒
* @param {Date} date 日期参数,默认当前日期
* @param {Number} num 加减数量,用正数和负数表示;默认+1
* @returns {Date} 返回加减后的日期
*/
function addSeconds(date = new Date(), num = +1) {
date.setSeconds(date.getSeconds() + num);
return date;
}
/**
* 日期加减毫秒
* @param {Date} date 日期参数,默认当前日期
* @param {Number} num 加减数量,用正数和负数表示;默认+100
* @returns {Date} 返回加减后的日期
*/
function addMillisecond(date = new Date(), num = +100) {
date.setMilliseconds(date.getMilliseconds() + num);
return date;
}
/**
* 日期加减周
* @param {Date} date 日期参数,默认当前日期
* @param {Number} num 加减数量,用正数和负数表示;默认+1
* @returns {Date} 返回加减后的日期
*/
function addWeek(date = new Date(), num = +1) {
date.setDate(date.getDate() + num * 7);
return date;
}
/**
* 日期加减季度
* @param {Date} date 日期参数,默认当前日期
* @param {Number} num 加减数量,用正数和负数表示;默认+1
* @returns {Date} 返回加减后的日期
*/
function addQuarter(date = new Date(), num = +1) {
date.setMonth(date.getMonth() + num * 4);
return date;
}
/* 格式化和解析日期 */
/**
* 日期对象转为日期字符串
* @description 支持日期字符串,日期对象,时间戳,unix时间戳
* @param {String|Date|Number} date 日期参数
* @param {String} format 转化格式
* @param {String} lang 语言zh和en,默认zh
* @returns {String} 返回日期字符串
*/
function formatDate(date, format = "yyyy-MM-dd", lang = "zh") {
if (isNull(date)) return "";
// 是日期字符串
if (isString(date)) {
date = parseDate(date);
}
// 是日期对象
else if (isDate(date)) ;
// 是时间戳
else if (isInteger(date) && String(date).length === 13) {
date = new Date(date);
}
// 是unix时间戳
else if (isInteger(date) && String(date).length === 10) {
date = new Date(date * 1000);
}
// 不支持的日期格式
else {
console.error("Not supported date format!");
return date;
}
// 配置规则
let rules = {
"M+": date.getMonth() + 1, // 月份
"d+": date.getDate(), // 日
"h+": date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 12小时制
"H+": date.getHours(), // 24小时制
"m+": date.getMinutes(), // 分钟
"s+": date.getSeconds(), // 秒
"S+": date.getMilliseconds(), // 毫秒
"a+": date.getHours() < 12 ? "am" : "pm", // 上午/下午,小写
"A+": date.getHours() < 12 ? "AM" : "PM", // 上午/下午,大写
"E+": date.getDay(), // 周
"Q+": Math.floor((date.getMonth() + 3) / 3), // 季度
S: date.getMilliseconds(), // 毫秒
};
// 年
let yearReg = new RegExp(/(y+)/g);
if (yearReg.test(format)) {
format = format.replace(yearReg, function (match, $1) {
return (date.getFullYear() + "").substring(4 - $1.length);
});
}
// 上午/下午
let amPmReg = new RegExp(/((b+)|(A+))/g);
if (amPmReg.test(format)) {
format = format.replace(amPmReg, function (match, $1) {
// AA或者aa为中文
if ($1.length > 1) {
return date.getHours() < 12 ? DATE.AM_PM[lang].AM : DATE.AM_PM[lang].PM;
}
// 其他为英文
else {
return $1 === $1.toLowerCase()
? date.getHours() < 12
? DATE.AM_PM["en"].AM.toLowerCase()
: DATE.AM_PM["en"].PM.toLowerCase()
: date.getHours() < 12
? DATE.AM_PM["en"].AM
: DATE.AM_PM["en"].PM;
}
});
}
// 周
let weekReg = new RegExp(/(E+)/g);
if (weekReg.test(format)) {
format = format.replace(weekReg, function (match, $1) {
return $1.length === 1
? DATE.WEEK[lang].MINI[date.getDay()]
: $1.length === 2
? DATE.WEEK[lang].SHORT[date.getDay()]
: DATE.WEEK[lang].FULL[date.getDay()];
});
}
// 季度
let quarterReg = new RegExp(/(Q+)/g);
if (quarterReg.test(format)) {
format = format.replace(quarterReg, function (match, $1) {
return $1.length === 1
? DATE.QUARTER[lang].MINI[Math.floor((date.getMonth() + 3) / 3) - 1]
: $1.length === 2
? DATE.QUARTER[lang].SHORT[Math.floor((date.getMonth() + 3) / 3) - 1]
: DATE.QUARTER[lang].FULL[Math.floor((date.getMonth() + 3) / 3) - 1];
});
}
// 经过上面的过滤,剩余的日期参数处理
for (let k in rules) {
let dateReg = new RegExp("(" + k + ")");
if (dateReg.test(format)) {
format = format.replace(dateReg, function (match, $1) {
return $1.length === 1
? rules[k]
: $1.length === 2
? ("00" + rules[k]).substring(("" + rules[k]).length)
: ("000" + rules[k]).substring(("" + rules[k]).length);
});
}
}
return format;
}
/**
* 日期字符串转为日期对象
* @description 支持日期字符串,时间戳,Unix时间戳
* @param {String|Number} value 日期参数
* @returns {Date} 返回日期对象
*/
function parseDate(value) {
if (isNull(value)) return null;
// 是日期字符串
if (isString(value)) {
return new Date(value.replace(/-/g, "/"));
}
// 是时间戳
else if (isInteger(value) && String(value).length === 13) {
return new Date(value);
}
// 是unix时间戳
else if (isInteger(value) && String(value).length === 10) {
return new Date(value * 1000);
}
// 不支持的日期格式
else {
console.error("Not supported date format!");
return value;
}
}
/* 内部使用的函数 */
/**
* 单个数字前自动补齐零为两位
* @param {String|Number} value 可以是数字和字符串
* @returns {String} 返回处理后的字符串
*/
function _digit(value) {
value = value.toString();
return value[1] ? value : "0" + value;
}
export { addDate, addHours, addMillisecond, addMinutes, addMonth, addQuarter, addSeconds, addWeek, addYear, formatDate, getAge, getBetweenDates, getBetweenMonths, getBetweenYears, getChineseZodiac, getDate, getDateArray, getDateObject, getDateTime, getDayOfMonth, getDayOfWeek, getDayOfYear, getDaysOfMonth, getDaysOfWeek, getDaysOfYear, getDiffDay, getDiffMonth, getDiffWeek, getDiffYear, getFirstDateOfMonth, getFirstDateOfWeek, getFirstDateOfYear, getFullDateOfMonth, getFullDateOfWeek, getFullDateOfYear, getLastDateOfMonth, getLastDateOfWeek, getLastDateOfYear, getNow, getOverTime, getPastTime, getQuarter, getTimestamp, getUnixTimestamp, getWeek, getWeekOfMonth, getWeekOfYear, getWeeksOfMonth, getWeeksOfYear, getZodiac, isAM, isAfter, isAfterTomorrow, isBefore, isBeforeYesterday, isBetween, isCommonYear, isFirstDayOfMonth, isFirstDayOfWeek, isFirstDayOfYear, isLastDayOfMonth, isLastDayOfWeek, isLastDayOfYear, isLeapYear, isPM, isSame, isSameMonth, isSameOrAfter, isSameOrBefore, isSameWeek, isSameYear, isToday, isTomorrow, isWeekend, isWorkday, isYesterday, lastMonth, lastWeek, lastYear, nextMonth, nextWeek, nextYear, parseDate, today, tomorrow, yesterday };