个人自用的日期操作类,附上详细注释,需要的同学自取(JavaScript)

Source
/**
 * @author xwc 2023-03-24
 * 日期操作类,封装了常用的日期操作方法。
 */
class DateTools {
    constructor() { }

    /**
     * 获取指定偏移量的日期。
     * @param {number} day 偏移量,正数表示未来日期,负数表示过去日期。
     * @param {string} [format='yyyy-MM-dd'] 格式化字符串,默认值为 'yyyy-MM-dd'。
     * @returns {string} 格式化后的日期字符串。
     *
     * @example
     * const today = DateTools.getDay(0); // 返回今天的日期
     * const threeDaysAgo = DateTools.getDay(-3, 'MM/dd/yyyy'); // 返回三天前的日期,格式为 'MM/dd/yyyy'
     */
    getDay(day, format = 'yyyy-MM-dd') {
        const today = new Date();
        today.setDate(today.getDate() + day);
        return this.formatDate(today, format);
    }

    /**
     * 获取指定偏移量的日期,并将其格式化为指定的格式。
     * @param {number} n 偏移量,0表示今天,-1表示昨天,1表示明天。
     * @param {string} [separator='-'] 连接符,默认为 '-'。
     * @return {string} 格式化后的日期字符串,例如 '2023-03-16'。
     *
     * @example
     * const today = DateTools.getDayFormat(0); // 返回今天的日期,格式为 'yyyy-MM-dd'
     * const yesterday = DateTools.getDayFormat(-1, '/'); // 返回昨天的日期,格式为 'yyyy/MM/dd'
     */
    getDayFormat(n, separator = '-') {
        let time = this.getDay(n)
        return time.split('-').join(separator)
    }

    /**
     * 将时间戳格式化为指定格式的日期字符串。
     * @param {number} timestamp 时间戳,单位为毫秒。
     * @param {string} format 格式化字符串,例如 'yyyy-MM-dd hh:mm:ss'。
     * @returns {string} 格式化后的日期字符串。
     *
     * @example
     * const timestamp = 1616598097000; // 时间戳,单位为毫秒
     * const formattedDate = DateTools.formatDate(timestamp, 'yyyy年MM月dd日'); // 格式化为 'yyyy年MM月dd日' 的形式
     * console.log(formattedDate); // 输出:2021年03月24日
     */
    formatDate(timestamp, format) {
        const date = new Date(timestamp);
        const padZero = (number, length = 2) => ('0'.repeat(length) + number).slice(-length);

        const map = { 'M': date.getMonth() + 1, 'd': date.getDate(), 'h': date.getHours(), 'm': date.getMinutes(), 's': date.getSeconds() };

        let formattedDate = format.replace(/(y+)/g, (_, p1) => `${date.getFullYear()}`.substr(4 - Math.min(4, p1.length)));

        for (const [key, value] of Object.entries(map)) {
            formattedDate = formattedDate.replace(new RegExp(`(${key}+)`, 'g'), (_, p1) => padZero(value, p1.length));
        }

        return formattedDate;
    }

    /**
     * 将指定时间加上一定的天数、小时数、分钟数和秒数。
     * @param {Date} date 需要进行加减操作的日期对象。
     * @param {number} [days=0] 增加或减少的天数,默认为 0。
     * @param {number} [hours=0] 增加或减少的小时数,默认为 0。
     * @param {number} [minutes=0] 增加或减少的分钟数,默认为 0。
     * @param {number} [seconds=0] 增加或减少的秒数,默认为 0。
     * @returns {Date} 加减后的新日期对象。
     *
     * @example
     * const now = new Date(); // 获取当前时间
     * const later = DateTools.addTime(now, 1, 2, 30); // 在当前时间基础上,加一天并加上两个小时半
     */ 
    addTime(date, days = 0, hours = 0, minutes = 0, seconds = 0) {
        const result = new Date(date);
        result.setTime(result.getTime() + (days * 86400000) + (hours * 3600000) + (minutes * 60000) + (seconds * 1000));
        return result;
    }

}
export default new DateTools();

在日常开发中,我们经常需要对日期进行操作,例如获取指定日期、格式化日期、加减日期等等。为了方便使用这些常用的日期操作方法,我们可以将其封装成一个工具类。

上述代码即为一个简单的日期操作类,它封装了常用的日期操作方法,包括:

  • 获取指定偏移量的日期
  • 获取指定偏移量的日期,并将其格式化为指定的格式
  • 将时间戳格式化为指定格式的日期字符串
  • 将指定时间加上一定的天数、小时数、分钟数和秒数

这些方法都非常常用,而且代码比较简单易懂,其注释也非常详细,使得在实际使用时也比较方便。下面我们逐个介绍这些方法的使用以及注意事项。

  1. 获取指定偏移量的日期

该方法通过传入一个表示偏移量的参数 day 来获取指定偏移量的日期。当 day 为正数时,表示获取未来的某个日期;当 day 为负数时,表示获取过去的某个日期。同时,该方法还支持将获取到的日期按照指定格式进行格式化,传入的参数 format 即为格式化字符串,默认为 'yyyy-MM-dd' 格式。

使用示例:

const today = DateTools.getDay(0); // 返回今天的日期
const threeDaysAgo = DateTools.getDay(-3, 'MM/dd/yyyy'); // 返回三天前的日期,格式为 'MM/dd/yyyy'

注意事项:

  • 该方法返回的是一个格式化后的字符串,而不是一个日期对象。
  • 当传入的参数 format 不合法时,该方法将会抛出异常。
  1. 获取指定偏移量的日期,并将其格式化为指定的格式

该方法与上一个方法类似,不同之处在于它支持直接传入一个表示偏移量的参数 n,可以更加方便地获取昨天、今天或者明天的日期。同时,该方法还支持将获取到的日期按照指定格式进行格式化,传入的参数 separator 即为连接符,默认为 '-'。

使用示例:

const today = DateTools.getDayFormat(0); // 返回今天的日期,格式为 'yyyy-MM-dd'
const yesterday = DateTools.getDayFormat(-1, '/'); // 返回昨天的日期,格式为 'yyyy/MM/dd'

注意事项:

  • 该方法返回的是一个格式化后的字符串,而不是一个日期对象。
  • 当传入的参数 separator 不合法时,该方法将会抛出异常。
  1. 将时间戳格式化为指定格式的日期字符串

该方法通过传入一个参数 timestamp 来将一个时间戳格式化为指定格式的日期字符串。其中,format 参数为格式化字符串,例如 'yyyy-MM-dd hh:mm:ss',函数内部会根据该字符串对时间戳进行格式化处理。该方法还支持自定义格式化函数 padZero,用于在数字前面补 0。

使用示例:

const timestamp = 1616598097000; // 时间戳,单位为毫秒
const formattedDate = DateTools.formatDate(timestamp, 'yyyy年MM月dd日'); // 格式化为 'yyyy年MM月dd日' 的形式
console.log(formattedDate); // 输出:2021年03月24日

注意事项:

  • 该方法返回的是一个格式化后的字符串,而不是一个日期对象。
  • 当传入的参数 format 不合法时,该方法将会抛出异常。
  1. 将指定时间加上一定的天数、小时数、分钟数和秒数

该方法通过传入一个表示需要进行加减操作的日期对象 date,以及可选的增加或减少的天数、小时数、分钟数和秒数来进行日期加减操作。其中,days 参数表示需要增加或减少的天数,默认为 0;hours 参数表示