date/DateUtil.js

'use strict';
const DatePattern = require('./DatePattern');

/**
 * date工具类
 */
class DateUtil {

    /**
     * 获取当前时间
     * @return {Date} 当前时间对象
     */
    static nowDate() {
        return new Date();
    }

    /**
     * 获取当前秒数
     * @return {number}
     */
    static nowDateSecond() {
        return this.dateSecond(this.nowDate());
    }

    /**
     * 获取日期秒数
     * @param date {Date}
     * @return {number}
     */
    static dateSecond(date) {
        return Math.floor(date.getTime() / 1000);
    }

    /**
     * 获取data的年
     * @param date {Date} 时间
     * @return {number} 4位/年
     */
    static year(date) {
        return date.getFullYear();
    }

    /**
     * 获得指定日期所属季度,从1开始计数 <br/>
     * 注:这里是每个月为一个季度
     * @param date {Date} 时间
     * @return {number} 季度
     */
    static quarter(date) {
        return Math.floor(date.getMonth() / 3+1);
    }

    /**
     * 获取指定日期的月份
     * @param date {Date} 时间
     * @return {number} 第几月
     */
    static month(date) {
        return date.getMonth() + 1;
    }

    /**
     * 获取日期在当年的第几天
     * @param date {Date}
     * @return {number}
     */
    static dayOfYear(date) {
        //一天 = 86400000ms =24 * 60 * 60 * 100

        return Math.ceil((this.nowDate()- new Date(this.year(date).toString())) /86400000 ) + 1;
    }

    /**
     * 获取日期为星期几 0 为周日 1为周一
     * @param date {Date}
     * @return {number}
     */
    static dayOfWeek(date) {
        return date.getDay();
    }

    /**
     * 是否为上午
     * @param date {Date}
     * @return {boolean}
     */
    static isAM(date) {

        return date.getHours() < 12;
    }

    /**
     * 是否为下午
     * @param date {Date}
     * @return {boolean}
     */
    static isPM(date) {
        return !this.isAM(date);
    }


    /**
     * 格式化时间
     * @param date {Date}
     * @param formatStr {string} 例如  yyyy-MM-dd HH:mm:ss
     * @return {string}
     */
    static format(date, formatStr) {

        let o = {
            "M+": this.month(date), //月份
            "d+": date.getDate(), //日
            "H+": date.getHours(), //小时
            "m+": date.getMinutes(), //分
            "s+": date.getSeconds(), //秒
            "q+": this.quarter(date), //季度
            "S": date.getMilliseconds() //毫秒
        };
        if (/(y+)/.test(formatStr)) {
            formatStr = formatStr.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
        }
        for (let k in o) {
            if (new RegExp("(" + k + ")").test(formatStr)) {
                formatStr = formatStr.replace(RegExp.$1, 1 === RegExp.$1.length ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
            }
        }
        return formatStr;
    }

    /**
     * 格式化时间为 yyyy-MM-dd HH:mm:ss
     * @param date {Date} 指定时间
     * @return {string} 格式化后的日期
     */
    static formatDateTime(date) {
        return this.format(date, DatePattern.NORM_DATETIME_PATTERN);
    }


    /**
     * 格式化时间为 yyyy-MM-dd
     * @param date {Date} 指定时间
     * @return {string} 格式化后的日期
     */
    static formatDate(date) {
        return this.format(date, DatePattern.NORM_DATE_PATTERN);

    }

    /**
     * 格式化时间为 HH:mm:ss
     * @param date {Date} 指定时间
     * @return {string}
     */
    static formatTime(date) {
        return this.format(date, DatePattern.NORM_TIME_PATTERN);
    }


    /**
     *  格式化时间为 中国时间
     *  yyyy年MM月dd日HH时mm分ss秒
     * @param date {Date} 指定时间
     * @return {string} 格式化后的时间字符串
     */
    static formatChineseDateTime(date) {
        return this.format(date, DatePattern.CHINESE_DATE_TIME_PATTERN);
    }

    /**
     * 获取指定日期当日的开始时间
     * @param date  {Date}
     * @return {Date}
     */
    static getStartDate(date) {
        return new Date(date.toLocaleDateString());
    }

    /**
     * 获取当天的开始时间
     * @return {Date}
     */
    static getToDayStartDate() {
        return this.getStartDate(new Date());
    }

    /**
     *  获取某一天的结束时间
     * @param date {Date} 指定时间
     * @return {Date}
     */
    static getEndDate(date) {
        //一天少一毫秒 = 24 * 60 * 60 * 1000 - 1  = 86399999
        return new Date(this.getStartDate(date).getTime()+86399999);
    }

    /**
     * 获取当天的结束时间
     * @return {Date}
     */
    static getToDayEndDate() {
        return this.getEndDate(new Date());
    }

    /**
     * 日期解析
     * <link>https://www.cnblogs.com/liuxianan/p/js-date-format-parse.html</link>
     * @param dateStr {string}
     * @param format {string} 例如'yyyy-MM-dd'
     * @return {Date|null}
     */
    static parse(dateStr,format){
        format = format || DatePattern.NORM_DATE_PATTERN;
        const obj = {y: 0, M: 1, d: 0, H: 0, h: 0, m: 0, s: 0, S: 0};
        format.replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g, function(m, $1, $2, $3, $4)
        {
            dateStr = dateStr.replace(new RegExp($1+'(\\d{'+$2.length+'})'+$4), function(_m, _$1)
            {
                obj[$3] = parseInt(_$1);
                return null;
            });
            return null;
        });
        obj.M--; // 月份是从0开始的,所以要减去1
        const date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s);
        if(obj.S !== 0){
            date.setMilliseconds(obj.S); // 如果设置了毫秒
        }
        return date;
    }


    /**
     * 获取本月第一天的日期
     * @param date {Date}
     * @return {Date}
     */
    static getFirstDayOfMonth(date){
        date.setDate(1);
        return date;
    }

}

module.exports = DateUtil