js 从开始和结束时间得到中间所有天

今天在论坛中看到一个帖子,给定输入的字符型日期和结束的字符型日期,计算中间间隔的每一天的日期。正好项目不忙,就动手写了一下,记录下来吧。

原问题

var start_time = "2015-2-1"

var end_time = "2015-3-1"

需求得到开始和结束时间之间所有天 return [ ‘2015-2-1‘,"2015-2-2" ... "2015-2-28","2015-3-1"]

method 1

<script>
// 获取间隔天数
function getDays(day1, day2) {
	// 获取入参字符串形式日期的Date型日期
	var d1 = day1.getDate();
	var d2 = day2.getDate();

	// 定义一天的毫秒数
	var dayMilliSeconds  = 1000*60*60*24;

	// 获取输入日期的毫秒数
	var d1Ms = d1.getTime();
	var d2Ms = d2.getTime();

	// 定义返回值
	var ret;

	// 对日期毫秒数进行循环比较,直到d1Ms 大于等于 d2Ms 时退出循环
	// 每次循环结束,给d1Ms 增加一天
	for (d1Ms; d1Ms <= d2Ms; d1Ms += dayMilliSeconds) {

		// 如果ret为空,则无需添加","作为分隔符
		if (!ret) {
			// 将给的毫秒数转换为Date日期
			var day = new Date(d1Ms);

			// 获取其年月日形式的字符串
			ret = day.getYMD();
		} else {

		// 否则,给ret的每个字符日期间添加","作为分隔符
			var day = new Date(d1Ms);
			ret = ret + ',' + day.getYMD();
		}
	}

	alert(ret); // 或可换为return ret;
}

// 给Date对象添加getYMD方法,获取字符串形式的年月日
Date.prototype.getYMD = function(){
    var retDate = this.getFullYear() + "-";  // 获取年份。
    retDate += this.getMonth() + 1 + "-";    // 获取月份。
    retDate += this.getDate();               // 获取日。
    return retDate;                          // 返回日期。
}

// 给String对象添加getDate方法,使字符串形式的日期返回为Date型的日期
String.prototype.getDate = function(){
	var strArr = this.split('-');
	var date = new Date(strArr[0], strArr[1] - 1, strArr[2]);
	return date;
}

getDays('2015-2-1', '2015-3-1');
</script>

上面的方法中,利用日期毫秒数比较的方式,同时让开始的日期进行自增,避免了计算每个月有多少天的情况。

getYMD 和 getDate 是分别在Date 和 String 原型上增加的方法,方便我们的使用。

method 2

打开chrome浏览器的console控制台

可以看到3月32日和4月1日的getTime 是相等的,所以,可以利用这点,让天数自增,来完成比较。

<script>
// 获取间隔天数
function getDays(day1, day2) {
	// 获取入参字符串形式日期的Date型日期
	var st = day1.getDate();
	var et = day2.getDate();

	// 定义返回的数组
	var retArr = [];

	// 循环,启动日期不等于结束日期时,进行循环
	while (st.getTime() != et.getTime()) {

		// 将启动日期的字符串形式的日期存放进数组
		retArr.push(st.getYMD());

		// 取得开始日期的天
		var tempDate = st.getDate();

		// 将开始日期st指向构造出的新的日期
		// 新的日期较之前的日期多加一天
		st = new Date(st.getFullYear(), st.getMonth(), st.getDate() + 1);
	}

	// 将结束日期的天放进数组
	retArr.push(et.getYMD());

	alert(retArr); // 或可换为return ret;
}

// 给Date对象添加getYMD方法,获取字符串形式的年月日
Date.prototype.getYMD = function(){
   var retDate = this.getFullYear() + "-";  // 获取年份。
   retDate += this.getMonth() + 1 + "-";    // 获取月份。
   retDate += this.getDate();               // 获取日。
   return retDate;                          // 返回日期。
}

// 给String对象添加getDate方法,使字符串形式的日期返回为Date型的日期
String.prototype.getDate = function(){
	var strArr = this.split('-');
	var date = new Date(strArr[0], strArr[1] - 1, strArr[2]);
	return date;
}

getDays('2015-2-9', '2015-3-8');
</script>

这里由于while循环的条件是
st.getTime() != et.getTime() 所以,while循环内,结束日期的字符型日期不会放进结果数组,所以要在while结束后将结束日期放进结果数组中。

method 3

<script>
// 获取间隔天数
function getDays(day1, day2) {
	// 获取入参字符串形式日期的Date型日期
	var st = day1.getDate();
	var et = day2.getDate();

	var retArr = [];

	// 获取开始日期的年,月,日
	var yyyy = st.getFullYear(),
		mm = st.getMonth(),
		dd = st.getDate();

	// 循环
	while (st.getTime() != et.getTime()) {
		retArr.push(st.getYMD());

		// 使用dd++进行天数的自增
		st = new Date(yyyy, mm, dd++);
	}

	// 将结束日期的天放进数组
	retArr.push(et.getYMD());

	alert(retArr); // 或可换为return ret;
}

// 给Date对象添加getYMD方法,获取字符串形式的年月日
Date.prototype.getYMD = function(){

    // 将结果放在数组中,使用数组的join方法返回连接起来的字符串,并给不足两位的天和月十位上补零
    return [this.getFullYear(), fz(this.getMonth() + 1), fz(this.getDate())].join("-");
}

// 给String对象添加getDate方法,使字符串形式的日期返回为Date型的日期
String.prototype.getDate = function(){
	var strArr = this.split('-');
	return new Date(strArr[0], strArr[1] - 1, strArr[2]);
}

// 给月和天,不足两位的前面补0
function fz(num) {
	if (num < 10) {
		num = "0" + num;
	}
	return num
}

getDays('2015-2-9', '2015-3-8');
</script>

方法3 中做了下面两点改进

  • 将while循环内的new Date() 时的入参定义到了外面,不用每次都使用st.getFullYear(),st.getMonth(),st.getDate() 的去获取,且new Date() 的天可以直接使用dd++,提高了运算效率
  • getYMD 中,直接使用[this.getFullYear(), fz(this.getMonth() + 1), fz(this.getDate())].join("-") 替代了之前的四行代码,且给月份和天进行了补位,在不足两位的时候前面补0,这样处理过的8位的字符日期可以保存数据库,再拿出来时也方便处理。
时间: 2024-10-10 07:17:54

js 从开始和结束时间得到中间所有天的相关文章

关于Web项目里的给表单验证控件添加结束时间不得小于开始时间的验证方法,日期转换和前台显示格式之间,还有JSON取日期数据格式转换成标准日期格式的问题

项目里有些不同页面间的日期显示格式是不同的, 第一个问题: 比如我用日期控件WdatePicker.js导包后只需在input标签里加上onClick="WdatePicker()"就可以用了,但是默认是没有时分秒的,如果需要显示时分秒只需要加上WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})就行. **************************************************************************

JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内

/* *JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内 *@param date1 date2(形如:'2015-01-01'类型字符串) */ function compareDate(date1,date2){ //对获得的时间戳区间与既定的时间戳进行比对 var baseDate1='2015-01-01'; var baseDate2='2015-03-31'; baseDate1=new Date(baseDate

js 开始时间,当前时间,结束时间的比较

//开始时间不能小于当前时间 function startTimeIsBigThanTotay(startTime){ var startdate = new Date((startTime).replace(/-/g,"/")); var date = new Date(); if(startdate < date) { return false; } else { return true; } } //结束时间不能小于当前时间 function endThanTotay(en

js获取本月,本季度,上个季度,本周,上周的起始和结束时间

1 /* 获得某月的天数 */ 2 function getMonthDays(myMonth) { 3 var nowYear = new Date().getFullYear(); //当前年 4 var monthStartDate = new Date(nowYear, myMonth, 1); 5 var monthEndDate = new Date(nowYear, myMonth + 1, 1); 6 var days = (monthEndDate - monthStartDa

js 開始时间,当前时间,结束时间的比較

//開始时间不能小于当前时间 function startTimeIsBigThanTotay(startTime){ var startdate = new Date((startTime).replace(/-/g,"/")); var date = new Date(); if(startdate < date) { return false; } else { return true; } } //结束时间不能小于当前时间 function endThanTotay(en

My97DatePicker设置开始时间与结束时间控制以及js中时间的比较

每次使用时间插件都会使用到My97DatePicker,这确实是一款不错的插件,而且新版本的兼容性也不错,兼容ie. 关于时间设置一般会遇到一些问题. <ul> <li> <span style="font-size:12px;">起始:</span> <label> <input type="text"id="starttime" readonly="readonly&

给表单验证控件添加结束时间不得小于开始时间的验证方法

//引入验证控件JS <script type="text/javascript" src="js/jquery.validate.js"></script> <script type="text/javascript"> function getDate(strDate) {  var date = eval('new Date('    + strDate.replace(/\d+(?=-[^-]+$)/,

bootstrap-datepicker 开始时间-结束时间 thinkphp

<!DOCTYPE html> <head> <title>开始-结束时间测试</title> </head> <body> <div> <p>方式一</p> <input type="text" name="datetimeStart" id="datetimeStart" value="{$map.datetimeSta

javascript 判断时间控件中,结束时间不能大于开始时间

1,在时间控件的onblur的时间上绑定checkDate()方法. 2,在js中添加如下方法: function checkDate(){ var str_date = document.getElementById("str_date").value; var end_date = document.getElementById("end_date").value; if(getDate(str_date)-getDate(end_date)>0){ al