前言
在 [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; }
以上经过严格验证,没有问题。