前后端知识交流分享

关于js中时间操作的一些总结

2018-08-28  本文已影响2人  Trytodo_zbs
1.前言

对于时间的操作是我们前端经常碰到的事,如果对这些不了解可能会碰到各种问题甚至兼容性问题
时间对象的使用方法也有简单有复杂,所以很多时候我们需要积累

2.内容

在js中我们使用new Date()获取当前时间

var t=new Date();
//获取当前年 月 日
var year=t.getFullYear();
//getMonth计数从0开始  真是月数应该加1
var month=t.getMonth()+1;
var day=t.getDate();
//当然还有获取当前星期几的
var weekday=t.getDay();
2.1 获取当前星期数

看到上面的获取星期数是不是觉得还差了点什么,不能获取直接用于显示的字符串,那么你可以使用下面的代码

//获取星期几
Date.prototype.getDayName = function() {
    var format = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
    return format[this.getDay()];
};

里面的文字描述可以自行更改;
合理利用原型可以使使用更加简单,以上代码的使用只需要

//Date原型上的方法这样使用就可以了
new Date().getDayName ();
2.2 时间格式化

我们最常碰到的情景,new Date()所得到的数据显然不会直接显示给用户,这是极不友好的表现
我们通常都会对时间经常通用性格式化,网上能找到不错的方法,甚至各个框架都会封装一下这个方法
以下代码摘抄自网络

    //格式化时间
    Date.prototype.Format = function(pattern) {
        /*初始化返回值字符串*/
        var returnValue = pattern;
        /*正则式pattern类型对象定义*/
        var format = {
            "y+": this.getFullYear(),
            "M+": this.getMonth()+1,
            "d+": this.getDate(),
            "H+": this.getHours(),
            "m+": this.getMinutes(),
            "s+": this.getSeconds(),
            "S": this.getMilliseconds(),
            "h+": (this.getHours()%12),
            "a": (this.getHours()/12) <= 1? "AM":"PM"
        };
        /*遍历正则式pattern类型对象构建returnValue对象*/
        for(var key in format) {
            var regExp = new RegExp("("+key+")");
            if(regExp.test(returnValue)) {
                var zero = "";
                for(var i = 0; i < RegExp.$1.length; i++) { zero += "0"; }
                var replacement = RegExp.$1.length == 1? format[key]:(zero+format[key]).substring(((""+format[key]).length));
                returnValue = returnValue.replace(RegExp.$1, replacement);
            }
        }
        return returnValue;
    };

    //使用方式
    new Date().Format("yyyy/MM/dd HH:mm:ss")

使用该方法可以将时间对象转换为已知的大部分常用格式

2.3 文本对象转为时间对象

一般情况下我们使用new Date(str)来转换文本为时间对象
在这里说一个重要的问题,为了保证浏览器兼容问题
str最好为"yyyy/MM/dd" 或者"yyyy/MM/dd HH:mm:ss"
总之就是年月日之前需要使用"/"来分隔
我碰到过使用"-"符号分隔的文本在谷歌可以 在safiri浏览器报错的问题

使用上面的Format可以封装一个方法使转化更方便

    //将String字符格式化为想要的时间格式
    //思路为先将字符转换为时间  再由时间转对应字符
    //前提条件 字符必须是按照yyyy MM dd HH:mm:ss对应的格式来 中间的空格为任意字符,但只能有一个人
    //对应基本规则每个字符段间隔只能有一个字符  年月日于时分秒之间必须是空格
    String.prototype.FormatDate = function(pattern){
        var str=this.split(''),i=0,len=str.length;
        for(;i<len;i++){
            if(isNaN(parseInt(str[i]))){
                if(str[i]!=':'&&str[i]!=' '){
                    str[i]='/';
                }
            }
        }
        str=new Date(str.join(''));
        return str.Format(pattern);
    };

该方法比较简陋
只能针对yyyy@MM@dd yyyy@MM@dd HH:mm:ss(@表示任意非数字单字符)进行转化
如果有更高的需求,可自行编写

3.一些小知识点

经过试验 Date对象直接-1可以得到时间 但是+号会直接拼装字符
所以使用加法的时候先使用getTime()

以下方法的总体思路就是 根据每天每月每年都有起始时间的特性来简单计算得到想要的结果
(每年每月每天的结束时间是不定的,但起始时间是恒定的)

//这些方法不一定是最好的
//获取当天
var now=new Date().Format("yyyy-MM-dd");
//获取上一天(昨天)
var prev=new Date(new Date(new Date().Format("yyyy/MM/dd"))-1);
//获取下一天
var next=new Date(new Date(new Date().Format("yyyy/MM/dd")+" 23:59:59").getTime()+1001);
//获取上一月
var prevMonth=new Date(new Date(new Date().Format("yyyy/MM")+"/01 00:00:00")-1);
//获取下一月   理论来说   每个月15在加30天    一定在下个月中旬左右
var nextMonth=new Date(new Date(new Date().Format("yyyy/MM")+"/15 00:00:00").getTime()+30*24*60*60*1000);
//其实可以获取当前月在组装时间
var  nextMonth=new Date(new Date().getFullYear()+"/"+(new Date().getMonth()+2));
//获取上一年
//经过试验只传年的情况下   默认时间是8点
var prevYear=new Date(new Date(new Date().Format("yyyy")+"/01/01 00:00:00")-1);
//获取下一年
//经过试验   当参数为数字时会出现时间变为1970的情况
var nextYear=new Date((new Date().getFullYear()+1).toString());

获取某年某月有多少天

//根据上面获取下月的方法
//规定月份就是当前月,不是按0开始计数的月份(也可以按需修改)
function getMonthLen(year,month){
    var  date=new Date(new Date(year+"/"+(month+1)+"/01 00:00:00")-1);
    return date.getDate();
}
上一篇 下一篇

猜你喜欢

热点阅读