一个朋友向我请教这个问题,我当时一个反应是,“不是有几个内部函数可以解决吗”,结果我再自己想想好象很复杂,又要考虑相隔每月天数又是闰年什么的,还好幸亏没有象这样的思维写下去,不然写出来会被死去的,基于这种“压力”下(不知道是谁说的,没有压力办不成事,这回我有点相信了!),我沉默了,打开了eclipse(才学不久,想把脸打肿一下)。
拿起笔在纸上画了画,而且是画的想blog日历格式(大概想blog想疯了),假如1日是星期三,11日是星期日,中间相隔11-1+1 = 11天(这小学都会),假如1日就是第一周,那么这11日是第二周怎么来的呢?(看图一看就知道)也就是说一定跟中间相隔几个7天有关,仔细看了看这图,11日刚好排在第二行末,每行7个(又废话了),就是14/7=2,即第二周,那么答案就出来了,(相隔)11 + (星期)3 = 14除以7就是第二周,推而之,12日是15/7 加上15%7(是否有余数,有就1,没有就0),故而第三周。
于是,我用javascript(当前在研究这,D和J一时又想不起来)语言写下了以下函数:
//计算从beginDate开始计算,posDate是第几周
function calExaWeek(beginDate, posDate)
{
//为了考虑周全,格式化日期时间对象
function formatDate(date)
{
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
}
var msSpan = (formatDate(posDate) - formatDate(beginDate)) / (24 * 60 * 60 * 1000); //计算相隔天数
var beginDay = beginDate.getDay(); //得到开始日期是星期几
var temp = beginDay + msSpan;
var m = Math.floor(temp / 7);
var n = temp % 7;
if (n > 0)
m = m + 1;
/*以上这一小部分可以省略为
var m = Math.floor(temp / 7) + (temp % 7 > 0);
*/
return m;
}
例如,以下结果是第2周
alert(calExaWeek(new Date(1970,0,1), new Date(1970,0,9)));
我在java领域里还是小学生,不过认识java到有段时间了,《Java夜未眠》这仍记忆尤新的,那些java历史且不说,就现在eclipse虽也开始好长一段时间了,它仍是最强大的开发平台或称为环境(IDE),不说它的免费它的开源,就它的可扩展性就能锁战披沥。
修理汽车需要拧螺丝,打开扳手工具包,试图找到合适的扳手。但是那些扳手的型号都不对,因为那个螺丝都属于公制标准的。只能使用与理想尺寸最相近的扳手。不好的做法结果是把那个螺丝弄裂了,只好去买一个专用的工具来下掉它。这个故事的精髓是:实现特定的事务永远需要使用恰当的工具。现在java使用者们都迅速迁移到eclipse上来了。
我就以这个小小故事做为结尾吧,对于eclipse也不用多谈,各位可能都是前辈,但是还需要注意一点,语言对程序员而言永远也只能看成是工具,工具不好用了要换的,但是做为程序员不能因为换工具而气势低落被打败,其实你已经拥有了编程技巧和方法,更专业一点就是“算法”,根本就是“换汤不换药”,没有什么了不起,有药不要汤不照样治病!
2006年8月7日 22:35:47 青峰