e起飞young
一个前端码农的技术博客
js日期相关操作汇总
[ 2017/08/03 ]

1.计算当前时间或指定时间的几小时、几天、几周、几个月、几年前或后

/*
 *计算当前时间或指定时间的几小时、几天、几周、几个月、几年前或后
 *date为object或string类型,栗子:new Date()或"2017-08-04 10:30:09"
 *num为number类型,表示几小时、几天、几周、几个月、几年
 *style为"+"(表示之后)或"-"(表示之前)
 *junit为"hour","day","week","month","year"
 */
function timeAddSubtract(date,num,style,junit){
	var datems,jmsec,dd,year,month,day,hour,minute,second;
	if(typeof(date)=='object'){
		datems = Date.parse(date);
	}else if(typeof(date)=='string'){
		datems = Date.parse(date.replace(/-/g, "/"));
	};
	if(junit == "month"){
		if(style == "+"){
			dd = new Date(datems);
			dd = new Date(dd.setMonth(dd.getMonth() + num));
		}else if(style == "-"){
			dd = new Date(datems);
			dd = new Date(dd.setMonth(dd.getMonth() - num));
		}
	}else if(junit == "year"){
		if(style == "+"){
			dd = new Date(datems);
			dd = new Date(dd.setFullYear(dd.getFullYear() + num));
		}else if(style == "-"){
			dd = new Date(datems);
			dd = new Date(dd.setFullYear(dd.getFullYear() - num));
		}
	}else{
		if(junit == "hour"){
			jmsec = 1000*60*60*num;
		}else if(junit == "day"){
			jmsec = 1000*60*60*24*num;
		}else if(junit == "week"){
			jmsec = 1000*60*60*24*7*num;
		};
		if(style == "+"){
			dd = new Date(datems + jmsec);
		}else if(style == "-"){
			dd = new Date(datems - jmsec);
		};
	};
	year = dd.getFullYear();
	month = (dd.getMonth()+1) < 10 ? "0" + (dd.getMonth()+1) : (dd.getMonth()+1);
	day = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate();
	hour = dd.getHours() < 10 ? "0" + dd.getHours() : dd.getHours();
	minute = dd.getMinutes() < 10 ? "0" + dd.getMinutes() : dd.getMinutes();
	second = dd.getSeconds() < 10 ? "0" + dd.getSeconds() : dd.getSeconds();
	result = year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;
	console.log(result)
	return result;
};
//使用栗子如下:
console.log("传入当前系统时间使用new Date()")
console.log("传入时间:")
timeAddSubtract("2017-08-04 10:30:09",0,"+","hour")
console.log("3小时后:")
timeAddSubtract("2017-08-04 10:30:09",3,"+","hour")
console.log("3天后:")
timeAddSubtract("2017-08-04 10:30:09",3,"+","day")
console.log("3周后:")
timeAddSubtract("2017-08-04 10:30:09",3,"+","week")
console.log("3个月后:")
timeAddSubtract("2017-08-04 10:30:09",3,"+","month")
console.log("3年后:")
timeAddSubtract("2017-08-04 10:30:09",3,"+","year")

2.计算两个时间的差值

function timeDiff(stime,etime){
	var startTime,endTime,tDiffMs,days,hours,minutes,seconds,leave1,leave2,leave3;
	startTime = new Date(Date.parse(new Date(stime.replace(/-/g, "/"))));
	  endTime = new Date(Date.parse(new Date(etime.replace(/-/g, "/"))));
	  tDiffMs = endTime.getTime() - startTime.getTime();//时间差的毫秒数
//计算出相差天数
	     days = Math.floor(tDiffMs/(24*3600*1000));
//计算出小时数
	   leave1 = tDiffMs%(24*3600*1000);//计算天数后剩余的毫秒数
	    hours = Math.floor(leave1/(3600*1000));
//计算相差分钟数
	   leave2 = leave1%(3600*1000);//计算小时数后剩余的毫秒数
	  minutes = Math.floor(leave2/(60*1000));
//计算相差秒数
	   leave3 = leave2%(60*1000);//计算分钟数后剩余的毫秒数
	  seconds = Math.round(leave3/1000);
	  //return days;
	console.log("相差 "+days+"天 "+hours+"小时 "+minutes+" 分钟"+seconds+" 秒")
};
timeDiff("2017-07-31 11:30:09","2017-08-04 10:35:12")

3.ios系统中js的new Date的格式问题

前端时间做一个web app,发现使用new Date('2017-01-01');这样的写法在ios系统中返回的是NaN,查阅相关资料后发现ios不支持这用日期格式,把"-"改为"/"就能够返回正常的值了。new Date('2017/01/01');也可以直接替换new Date(Date.parse(date.replace(/-/g, "/")));

4.获取某个月份的天数

在使用其他语言获取每月天数的时候,一般都是存储到一个数组中进行获取,但是如果是二月份的话就需要首先判断是否闰年,再确定是28还是29了。

js可以通过Date对象很方便的获取到每月的天数(无需再麻烦的区分闰年),在初始化Date对象时,我们可以通过这种方式

var d = new Date(2015,2,0);
console.log(d.getDate());

以上代码可以在控制台输出2015年2月份的天数;Date对象月份从0开始,即0表示1月份,以此类推;在上面的代码中,我们初始化d为三月份的第0天,由于JavaScript中day的范围为1~31中的值,所以当设为0时,会向前 一天,也即表示上个月的最后一天。

有朋自远方来...评论一下呗O(∩_∩)O

  • 搜索