关于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();
}