首页 > 技术文章 > JavaScript--前端开发工作中常见的时间处理问题

zaishiyu 2020-11-15 22:15 原文

前言

  在前端开发工作中,服务端返回的时间数据或者你传递给服务端的时间参数经常会遇到时间格式转换及处理问题。这里分享一些我收集到的一些处理方法,方便日后工作中快速找到。先附上必须了解的知识内置对象传送门https://www.w3school.com.cn/js/js_dates.asp

目录

  • 时间格式化
  • 获取当年的第一天
  • 获取指定年指定月份的第一天
  • 获取指定年指定月份的最后一天
  • 获取当前季度的第一天
  • 获取两个日期的相差天数
  • 获取指定的某一天所在的星期范围
  • 获取指定的某一天还差几天过年
  • 获取指定的某一天是星期几
  • 比较传入的两个日期中第一个日期是否比另外一个日期早
  • 计算某一时间偏移后的日期

正文

时间格式化 

 1   Date.prototype.formatDate=function(format){
 2             var o = {
 3                 "M+": this.getMonth()+1 , //月份 
 4                 "d+": this.getDate(), //
 5                 "h+": this.getHours(), //小时 
 6                 "m+": this.getMinutes(), //
 7                 "s+": this.getSeconds(), //
 8                 "q+": Math.floor((this.getMonth() + 3) / 3), // 季度
 9                 "S": this.getMilliseconds() // 毫秒
10             };
11             // 根据y的长度来截取年
12             if (/(y+)/.test(format)){ 
13                 //console.log(RegExp.$1);yyyy
14                 format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
15             }
16 
17             // console.log(format);1999-MM-DD 
18             for (var k in o){
19                 if (new RegExp("(" + k + ")").test(format)) 
20                 format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
21             }
22             return format;
23             }
24             // 用法: 
25             var time1 = new Date(99,3,2).formatDate("yyyy-MM-dd");
26             var time2 = new Date().formatDate("yyyy-MM-dd hh:mm:ss");
27             console.log(time1);//1999-04-02
28             console.log(time2);//2020-11-15 21:21:55

获取当年的第一天

 function getFirstDayOfYear () {
        var date = new Date();
        date.setDate(1);
        date.setMonth(0);
        return date.formatDate('yyyy-MM-dd');;
    }
    console.log(getFirstDayOfYear())//2020-1-1

 

  获取指定年指定月份的第一天

function getCurrentMonthFirstDay(currentMonth) {
        var endDate=new Date(currentMonth)
        var month=endDate.getMonth();
        var currentMonthFirstDay=new Date(endDate.getFullYear(),month,1)
        var firstDate=currentMonthFirstDay.toLocaleDateString().replace(new RegExp("/","g"),"-")
        return firstDate
        }
    console.log(getCurrentMonthFirstDay('2020-11'))//2020-11-1

 

  获取指定年指定月的最后一天

  function getCurrentMonthLastDay(currentMonth) {
        var endDate=new Date(currentMonth)
        var month=endDate.getMonth();
        var nextMonth=++month;
        var nextMonthFirstDay=new Date(endDate.getFullYear(),nextMonth,1);
        var oneDay=1000*60*60*24;
        var dateString=new Date(nextMonthFirstDay-oneDay)
        return dateString.toLocaleDateString().replace(new RegExp("/","g"),"-")
        }
    console.log(getCurrentMonthLastDay("2020-2"))//2020-2-29

 

  获取当前季度的第一天

  function getFirstDayOfSeason () {
            var date = new Date();
            var month = date.getMonth();
            if(month <3 ){
                date.setMonth(0);
            }else if(2 < month && month < 6){
                date.setMonth(3);
            }else if(5 < month && month < 9){
                date.setMonth(6);
            }else if(8 < month && month < 11){
                date.setMonth(9);
            }
            date.setDate(1);
            return date.formatDate('yyyy-MM-dd');;
        }
        console.log(getFirstDayOfSeason())//2020-10-01

 

  获取两个日期的相差天数

  function getDiff(startDate, endDate) {
            var stime = Date.parse(new Date(startDate));
            var etime = Date.parse(new Date(endDate));
            // 两个时间戳相差的毫秒数
            var usedTime = etime - stime;
            // 计算相差的天数  
            var days = Math.floor(usedTime / (24 * 3600 * 1000));
            // 计算天数后剩余的毫秒数
            var leave1 = usedTime % (24 * 3600 * 1000);  
            // 计算出小时数  
            var hours = Math.floor(leave1 / (3600 * 1000));
            // 计算小时数后剩余的毫秒数
            var leave2 = leave1 % (3600 * 1000);        
            // 计算相差分钟数
            var minutes = Math.floor(leave2 / (60 * 1000));
            var time = days + "天" + hours + "时" + minutes + "分";
            return time;
        }
        console.log(getDiff("2020-10-01","2020-11-20"))//50天0时0分

 

  获取指定的某一天所在的星期范围

  function getWeekRange(date) {
            if(!date) return
            var now = new Date(date);
            var nowDayOfWeek = now.getDay();  // 星期日—>六(0->6)
            var nowDay = now.getDate();
            var nowMonth = now.getMonth();
            var nowYear = now.getYear(); // 2019年是119
            nowYear += (nowYear < 2000) ? 1900 : 0;
            var weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek+1);  // 这周的周五
            var weekEndDate = new Date(nowYear, nowMonth, nowDay + (7 - nowDayOfWeek));   // 7- 这周的周日  &&  用5- 得到这的周五
            return weekStartDate.formatDate('yyyy-MM-dd') + " 至 " + weekEndDate.formatDate('yyyy-MM-dd');
            }
        console.log(getWeekRange("2020-11-11"))//2020-11-09 至 2020-11-15

 

获取指定的某一天还差几天过年

   function restDayOfYear() {
            var fullyear = new Date().getFullYear();
            var nextyear = fullyear + 1;
            var lastday = new Date(new Date(nextyear,0,1) - 1); //本年的最后一毫秒:
            var now = new Date();
            var diff = lastday - now;  //毫秒数
            return Math.ceil(diff / (1000 * 60 * 60 * 24));
        }
        console.log(restDayOfYear("2020-11-15"))//47

 

  获取指定的某一天是星期几

  function getWeekZh(value) {
        var dateArray = value.split("-");
        var zhWeek = "星期" + "日一二三四五六".charAt(new Date(dateArray[0], parseInt(dateArray[1] - 1), dateArray[2]).getDay());
        return zhWeek
        }
        console.log(getWeekZh("2020-10-10"))//星期六

 

  比较传入的两个日期中第一个日期是否比另外一个日期早

   function compareDate(firstDate,secondDate){
            var arrayD1 = firstDate.split("-");
            var date1 = new Date(arrayD1[0],arrayD1[1],arrayD1[2]);
            var arrayD2 = secondDate.split("-");
            var date2 = new Date(arrayD2[0],arrayD2[1],arrayD2[2]);
            //日期对象可以直接进行比较
            if(date1 < date2) return true;             
                return false;
            }
        console.log(compareDate("2020-10-10","2020-11-15"))//true

 

计算某一时间偏移后的日期

   function getAfterDate(time,count) {   
            time.setDate(time.getDate() + count);//获取N天后的日期  
            var date = new Date(+time + 8 * 3600 * 1000);
                return date.toJSON().substr(0, 19).replace('T', ' ').replace(/-/g, '.');
        }  
        console.log(getAfterDate(new Date(),100))// 2021.02.23 22:00:36

总结

  以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长踩坑之路会持续更新一些工作中常见的问题和技术点。

推荐阅读