• 日期相关的一些简单计算:格式化,上个月,前一天


    关于日期计算,做个小笔记。

    格式化

    Date.prototype.formatStr = function(format) {
        var o = {
            "M+": this.getMonth() + 1, // month
            "D+": this.getDate(), // day
            "h+": this.getHours(), // hour
            "m+": this.getMinutes(), // minute
            "s+": this.getSeconds(), // second
            "q+": Math.floor((this.getMonth() + 3) / 3), // quarter,季度
            "S": this.getMilliseconds()
        };
    
        if (/(Y+)/.test(format)) {
            format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        }
    
        for (var k in o) {
            if (new RegExp("(" + k + ")").test(format)) {
                format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : padLeftZero(o[k]);
            }
        }
        return format;
        
        // 左侧补零
        function padLeftZero (str) {
            return ('00' + str).substr((str + '').length);
        }
    };
    

    上个月

    var now = new Date();
    var fullyear = now.getFullYear();
    var month = now.getMonth();
    
    // 上个月第一天
    var prevMonthFirst = new Date(fullyear, month - 1, 1);
    
    // 上个月有多少天
    // new Date(2019, 1, 0).getDate(); // 表示 2019/1/1的前一天,即 2018/12/31,通常用这个来计算某月的天数
    var prevMonthDays = new Date(fullyear, month, 0).getDate();
    
    // 上个月最后一天
    var prevMonthLast = new Date(fullyear, month -1, prevMonthDays).formatStr('YYYY-MM-DD');
    

    根据上面的规律,可计算得到下个月。简单封装一个方法,求:获取给定日期的指定月份的开始、结束日期

    function getMonthByDate (date, months, formate) {
        formate = formate || "YYYY-MM-DD";
        date = new Date(date.replace(/-/g, "/"));
        var fullyear = date.getFullYear();
        var month = date.getMonth() + months;
        
        // 指定月第一天
        var monthFirst = new Date(fullyear, month, 1).formatStr(formate);
        
        // 指定月有多少天
        // new Date(2019, 1, 0).getDate(); // 表示 2019/1/1的前一天,即 2018/12/31,通常用这个来计算某月的天数
        var monthDays = new Date(fullyear, month + 1, 0).getDate();
        
        // 指定月最后一天
        var monthLast = new Date(fullyear, month, monthDays).formatStr(formate);
        
        return {
            first: monthFirst,
            last: monthLast
        }
    };
    
    // 举例
    getMonthByDate('2018-9-17', -1); // 上个月 {first: "2018-08-01", last: "2018-08-31"}
    
    getMonthByDate('2018-9-17', -2); // {first: "2018-07-01", last: "2018-07-31"}
    
    getMonthByDate('2018-9-17', -3); // {first: "2018-06-01", last: "2018-06-30"}
    
    getMonthByDate('2018-9-17', -7); // {first: "2018-02-01", last: "2018-02-28"}
    
    getMonthByDate('2018-9-17', 1); // 下个月 {first: "2018-10-01", last: "2018-10-31"}
    
    getMonthByDate('2018-9-17', 2); // {first: "2018-11-01", last: "2018-11-30"}
    

    前一天

    var now = new Date();
    
    // 前一天
    var prevDate = new Date(now.setDate(now.getDate() - 1)).formatStr('YYYY-MM-DD');
    

    前一天比较简单,也简单封装一个方法,求:获取给定日期加指定天数的日期

    function getNewDateByDate (date, days, formate) {
        formate = formate || "YYYY-MM-DD";
        date = new Date(date.replace(/-/g, "/"));
        return new Date(date.setDate(date.getDate() + days)).formatStr(formate);
    }
    
    举例:
    getNewDateByDate('2019-1-4', -1); // 前一天,"2019-01-03"
    getNewDateByDate('2019-1-4', 1); // 后一天,"2019-01-05"
    

    日期比较

    new Date('2019-01-03') - new Date('2019-01-02'); // 86400000
    
    new Date('2019-01-03') - new Date('2019-01-04'); // -86400000
    
    // 日期比较
    function compareDate (strDate1, strDate2) {
        var date1 = new Date(strDate1.replace(/-/g, '/'));
        var date2 = new Date(strDate2.replace(/-/g, '/'));
        
        return date1 - date2;
    };
    
    // 举例:
    compareDate('2019-01-03', '2019-01-02') > 0; // true
    
    compareDate('2019-01-03', '2019-01-04') < 0; // true
    

    获取开始、结束时间间隔的具体日期,包括开始结束

    function getIntervalDays (beginDate, endDate, formate) {
        var oneDayMilliseconds = 24 * 60 * 60 * 1000;
        var intervalDays = Math.abs(compareDate(beginDate, endDate)) / oneDayMilliseconds;
        
        var dates = [];
        for (var i = 0; i <= intervalDays; i++) {
            dates.push(getNewDateByDate(beginDate, i, formate));
        }
        
        return dates;
    }
    
    // 举例
    getIntervalDays('2019-01-03', '2019-01-04'); // ["2019-01-03", "2019-01-04"]
    
    getIntervalDays('2019-01-01', '2019-01-04'); // ["2019-01-01", "2019-01-02", "2019-01-03", "2019-01-04"]
    
  • 相关阅读:
    spring aop 之链式调用
    Java中的java.lang.Class API 详解
    Java 内省(Introspector)和 BeanUtils
    Small Spring系列一:BeanFactory(一)
    (C#) 多线程访问探讨,如果保证线程安全?
    (C#) 多线程访问int, bool 等值类型变量
    (WCF) 利用WCF实现两个Process之间的通讯。
    (PowerShell) 重命名文件
    JavaScript : Array assignment creates reference not copy
    (C#) 表达式树
  • 原文地址:https://www.cnblogs.com/EnSnail/p/10227340.html
Copyright © 2020-2023  润新知