日期:2014-05-16  浏览次数:20327 次

[Ext JS 4] 实战之 带week(星期)的日期选择控件(三)

前言

在 [Ext JS 4] 实战之 带week(星期)的日期选择控件(二)

的最后,有提到一个解决方案。

不过这方案有一个条件  ==》 “2. 每年的周数从(1-52), 如果超过52 周,算到下一年的第一周”

这个条件有一个漏洞就是: 像 2011 年, 全年53 周, 第 53周整周都是2011年的天数,所以算成2012年的第一周就不对了。

综合: 还是两套标准之间的换算还是会有一些问题。

既然这样就不去混合使用两套标准的方法。 对于每个星期一周日开始的标准来说, 可以有更简单的方法。


解决方案

算法思想:

1. 每年的第一天(01/01) 是这一年的第一周。

2. 年中的某一天减去第一天的天数 再加上 第一天是这一年的第几天 后  除以7; 往上取整得到的整数就应该是这天的周数。

function getWeekNumber(date)
{
	var onejan = new Date(date.getFullYear(),0,1);
	return Math.ceil((((date - onejan) / 86400000) + onejan.getDay()+1)/7);
}

说明:

1. 两个日期相减得到的是这两个日期之间的距离的毫秒数

2. 86400000的由来 是 24*3600*1000  (1000ms = 1s ; 1h = 3600s; 1d = 24h)

3. getDay() 取值是从 0 到 6, getDay()+1 是得到是第几天


这样得到 W1335 这样的周的方式就很简单了:

function getWeekStrOfDate(date)
{
	var weekStr = null;
	if(date!=null)
	{
		weekStr = "W";
		var dateYear = date.getFullYear();
		var yearStr = dateYear.toString();
		yearStr = yearStr.substring(2,4);
		var dateWeek = getWeekNumber(date);
		var dateWeekStr = dateWeek.toString();
		if(dateWeekStr.length<2)
		{
			dateWeekStr = "0" + dateWeekStr;
		}
		weekStr += yearStr;
		weekStr += dateWeekStr; 	
	}
	return weekStr;
}

以上经过严格验证,没有问题。