util-4.日期时间操作函数

版权声明:zf版权所有 https://blog.csdn.net/u014381542/article/details/89028763
/**
 * ========================日期时间操作函数========================
 */
var dateUtil={
    /**
     * 日期正则yyyy-MM-dd
     */
  "dateExp" : /^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$/,

    /**
     * 时间正则(yyyy-MM-dd hh:mm:ss)
     */
  "timeExp" : /^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))\s+(([01]\d)|2[0-3]):([0-5]\d):([0-5]\d)$/,

    /**
     * 获取指定年月的天数
     * @param year //年
     * @param month //月
     * @returns {number}
     */
  "getDays" : function(year,month){  
      var totalDays=30;
      if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
        totalDays=31;
      }else if(month==2){
        if(year%400==0 || (year%100!=0 && year%4==0)){  //闰年2月
          totalDays=29; 
        }else{  //平年2月
          totalDays=28;
        }
      }
      return totalDays;
  },

    /**
     * 将单位数字转换为带0的双位数
     * @param n //需要转换的数字
     * @returns {string}
     */
  "toTwo" : function(n){  
      return n<10?"0"+parseInt(n):n;
  },

    /**
     * 获取今日日期
     * @param joinstr //可填,分隔符,默认为"-"
     * @returns {string}
     */
    "getToday": function(joinstr){
        var date = new Date();
        var year = date.getFullYear();
        var month = this.toTwo(date.getMonth() + 1);
        var day = this.toTwo(date.getDate());
        var fenge = joinstr ? joinstr : "-"; //分隔字符
        var s = year + fenge + month + fenge + day;
        return s;
    },

    /**
     * 获取指定日期前一天的日期
     * @param date //指定日期
     * @returns {*|string}
     */
  "getYesterday" : function(date){    
      if(!this.dateExp.test(date)){
        console.log("日期格式不正确:"+date);
        return;
      }
      return this.getAfterDaysLocale(date,-1);
  },

    /**
     * 获取指定日期后一天的日期
     * @param date //指定日期
     * @returns {*|string}
     */
  "getTomorrow" : function(date){      
      if(!this.dateExp.test(date)){
        console.log("日期格式不正确:"+date);
        return;
      }
      return this.getAfterDaysLocale(date,1);      
  },

    /**
     * 获取指定日期本地时间后n天的日期,支持负数(北京处于东八区,即8点之后才开始算当天)
     * @param date  //指定日期
     * @param n //间隔天数
     * @returns {string}
     */
  "getAfterDaysLocale" : function(date,n) {
      var s, d, t, t2;
        /**
         * new Date("2018-01-01")问题:
         在pc端浏览器或者微信开发者工具中都正常,但是在手机端计算结果为NAN,
         需要将格式转为yyyy/MM/dd(2018/01/01)或者new Date(yyyy,MM,dd);
         */
      date = date.replace(/[^\d]/g, '/'); 
      t  = new Date(date).getTime();
      t2 = n * 1000 * 3600 * 24;
      t += t2;
      d  = new Date(t);
      s  = d.getFullYear() + "-";
      s += this.toTwo(d.getMonth()+1)+ "-";
      s += this.toTwo(d.getDate());
      return s;
  },

    /**
     * 获取UTC时间后n天的日期,支持负数
     * @param yy
     * @param mm
     * @param dd
     * @param n
     * @returns {string}
     */
  "getAfterDaysUTC" : function(yy,mm,dd,n) {
      var s, d, t, t2;
      t= Date.UTC(yy,mm-1,dd);
      t2 = n * 1000 * 3600 * 24;
      t+= t2;
      d = new Date(t);
      s = d.getUTCFullYear() + "-";
      s += ("00"+(d.getUTCMonth()+1)).slice(-2) + "-";
      s += ("00"+d.getUTCDate()).slice(-2);
      return s;
  },

    /**
     * 获取该年已过去天数&剩余天数
     * @param startYMD //指定日期,可填,默认今日
     * @returns {{pastDays: number, leftDays: number}}
     */
  "getLeftPastDays": function(startYMD){
      startYMD = startYMD?startYMD.replace(/[^\d]/g, '/'):""; 
      var today = startYMD ? new Date(startYMD) : new Date(),
          thisYear = today.getFullYear(),
          startDay = new Date(thisYear + "/01/01"),
          endDay = new Date(thisYear + "/12/31");
      var pastDays = parseInt((today.getTime() - startDay.getTime()) / (1000 * 60 * 60 * 24)),
          leftDays = parseInt((endDay.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
      return { "pastDays": pastDays, "leftDays": leftDays };
  },

    /**
     * 获取两个日期之间相差的天数
     * @param startDate
     * @param endDate
     * @returns {number}
     */
    "getDateDiff": function (startDate, endDate) {
        var startTime = new Date(Date.parse(startDate.replace(/-/g, "/"))).getTime();
        var endTime = new Date(Date.parse(endDate.replace(/-/g, "/"))).getTime();
        var dates = Math.abs((startTime - endTime)) / (1000 * 60 * 60 * 24);
        return dates;
    },

    /**
     * 获取两个时间的时间差,转换成分
     * @param time1
     * @param time2
     * @returns {number}
     */
  "getMinutesDiff" : function(time1,time2){
      var date1 = new Date();
      var date2 = new Date();
          date1.setHours(time1.split(":")[0],time1.split(":")[1]);
          date2.setHours(time2.split(":")[0],time2.split(":")[1]);
      var diff = ((date2.getTime() - date1.getTime())/1000)/60;
      return diff;
  },

    /**
     * 获取现在到指定日期之间的秒数
     * @param endDate //截止日期
     * @returns {number}
     */
  "getSecondDiff": function (endDate) {
    var startTime = new Date().getTime();
    var endTime = new Date(Date.parse(endDate.replace(/-/g, "/"))).getTime();
    var seconds = (endTime - startTime) / 1000;
    return parseInt(seconds);
  },

    /**
     * 时间戳转换成hh:mm:ss
     * @param mss //时间戳
     * @returns {{s: (*|string), h: (*|string), days: number, time: string, m: number}}
     */
  "transTime": function (mss){
    mss = mss*1000;
    var days = parseInt(mss / (1000 * 60 * 60 * 24));
    var h = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)) + days*24;
    var m = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60));
    var s = (mss % (1000 * 60)) / 1000;
        h = this.toTwo(h);
        m = this.toTwo(m);
        s = this.toTwo(s);
    return {
      time: h + ":" + m + ":" + s,
      days: days,
      h: h,
      m: m,
      s: s
    }
  },

    /**
     * 周数字转文字
     * @param num
     * @returns {string}
     */
  "transToWeek": function (num) {
    switch (num) {
      case 0: return "日"; break;
      case 1: return "一"; break;
      case 2: return "二"; break;
      case 3: return "三"; break;
      case 4: return "四"; break;
      case 5: return "五"; break;
      case 6: return "六"; break;
      case 7: return "日"; break;
    }
  },

    /**
     * 获取当前时间表示字符串:
     12:00-13:00(下午12:00-12:59)
     13:00-24:00(下午1:00-11:59)
     * @param time
     * @returns {string}
     */
    "getTimeType" : function(time){
        var hour = Number(time.split(":")[0]);
        return hour<12 ? "早上" : "下午";
    },

    /**
     * 获取日期的相关格式信息: yyyy-MM-dd hh:mm:ss
     * @param dateparam //可填,指定日期,默认为今天
     * @returns {{formatdate: string, seconds: (*|string), month: (*|string), hour: (*|string), year: number, minutes: (*|string), hmstime: string, ymddate: string, day: (*|string)}}
     */
    "getFormatDate": function(dateparam){
        var date = new Date();
        if (dateparam){
            dateparam = dateparam.replace(/-/g, "/");
            date = new Date(dateparam);
        }
        var year = date.getFullYear();
        var month = this.toTwo(date.getMonth() + 1);
        var day = this.toTwo(date.getDate());
        var hour = this.toTwo(date.getHours());
        var minutes = this.toTwo(date.getMinutes());
        var seconds = this.toTwo(date.getSeconds());

        var ymddate = year + "-" + month + "-" + day;
        var hmstime = hour + ":" + minutes + ":" + seconds;
        var formatdate = year + "-" + month + "-" + day + " " + hour + ":" + minutes + ":" + seconds;
        return {
            year: year,
            month: month,
            day: day,
            hour: hour,
            minutes: minutes,
            seconds: seconds,
            ymddate: ymddate,
            hmstime: hmstime,
            formatdate: formatdate
        };
    }
}

/**
 *   功能: 日期格式化输出
     alert(new Date().format("yyyy年MM月dd日"));
     alert(new Date().format("MM/dd/yyyy"));
     alert(new Date().format("M/d/yyyy"));
     alert(new Date().format("yyyyMMdd"));
     alert(new Date().format("yyyy-MM-dd hh:mm:ss"));
     new Date("2016-01-01").format("yyyyMMdd")或new Date("2016/01/01").format("yyyyMMdd")
 * @param fmt
 * @returns {*}
 */
Date.prototype.format = function(fmt) {
  var o = {
    "M+" : this.getMonth() + 1, // 月份
    "d+" : this.getDate(), // 日
    "h+" : this.getHours(), // 小时
    "m+" : this.getMinutes(), // 分
    "s+" : this.getSeconds(), // 秒
    "q+" : Math.floor((this.getMonth() + 3) / 3), // 季度
    "S" : this.getMilliseconds() // 毫秒
  };
  if (/(y+)/.test(fmt))
    fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "")
        .substr(4 - RegExp.$1.length));
  for ( var k in o)
    if (new RegExp("(" + k + ")").test(fmt))
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k])
          : (("00" + o[k]).substr(("" + o[k]).length)));
  return fmt;
}


/**      
 * 对Date的扩展,将 Date 转化为指定格式的String      
 * 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) 可以用 1-2 个占位符      
 * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)      
 * eg:      
 * (new Date()).pattern("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423      
 * (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04      
 * (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04      
 * (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04      
 * (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18      
 */        
Date.prototype.pattern=function(fmt) {         
    var o = {         
      "M+" : this.getMonth()+1, //月份         
      "d+" : this.getDate(), //日         
      "h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小时         
      "H+" : this.getHours(), //小时         
      "m+" : this.getMinutes(), //分         
      "s+" : this.getSeconds(), //秒         
      "q+" : Math.floor((this.getMonth()+3)/3), //季度         
      "S" : this.getMilliseconds() //毫秒         
    };         
    var week = {         
      "0" : "/u65e5",         
      "1" : "/u4e00",         
      "2" : "/u4e8c",         
      "3" : "/u4e09",         
      "4" : "/u56db",         
      "5" : "/u4e94",         
      "6" : "/u516d"        
    };         
    if(/(y+)/.test(fmt)){         
        fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));         
    }         
    if(/(E+)/.test(fmt)){         
        fmt=fmt.replace(RegExp.$1, ((RegExp.$1.length>1) ? (RegExp.$1.length>2 ? "/u661f/u671f" : "/u5468") : "")+week[this.getDay()+""]);         
    }         
    for(var k in o){         
        if(new RegExp("("+ k +")").test(fmt)){         
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));         
        }         
    }         
    return fmt;         
}

猜你喜欢

转载自blog.csdn.net/u014381542/article/details/89028763
今日推荐