前言:为什么我会走上程序员这条路,明知道脑子不够用,还整天写代码,也不知道写的什么,只知道复制粘贴,嗨。只想说一句“Fuck”.
来说下我脑子如何瞬间变浆糊的。
项目中要求根据日期计算当前选择日期是一年中的第几周,好吧,大家仔细看:
JS版本:(用的是My97datePicker时间选择器)
1 $("#<%=tbWeekDate.ClientID%>").click(function () { 2 WdatePicker({ 3 dateFmt: 'yyyy-MM-dd', 4 isShowWeek: true, 5 firstDayOfWeek: 1, 6 onpicked: function () { 7 var value = $("#<%=tbWeekDate.ClientID%>").val(); 8 var dt = new Date(value); 9 var sumDay = 0;10 for (var i = 1; i < dt.getMonth() + 1 ; i++) {11 sumDay += new Date(dt.getFullYear(), i, 0).getDate();12 }13 sumDay += dt.getDate();14 var firstDate = new Date(dt.getFullYear() + "-01-01");15 alert(firstDate.getDay());16 var diff = firstDate.getDay() - 1;17 if (diff < 0) {18 diff = 6;19 }20 sumDay = sumDay + diff;21 var week = Math.ceil(sumDay / 7.0);22 $("#<%=tbWeekValue.ClientID%>").val(week);23 $("#<%=hfWeekValue.ClientID%>").val(week);24 }25 });26 });
我来解释下代码:
首先先根据当前选择的日期获取月份,比如选择的是2013-10-25,那么当前是10月,循环这10个月份,获取这个10个月份的总天数,代码如下:
1 var sumDay = 0;2 for (var i = 1; i < dt.getMonth() + 1 ; i++) {3 sumDay += new Date(dt.getFullYear(), i, 0).getDate();4 }5 sumDay += dt.getDate();
好吧,犯二开始了:
我就在想为啥要在总天数的基础上加上diff的天数呢,比如十月二十五号是今天的289天,那我直接除以7不就是今天的第几周嘛,我看了好久都没明白,自己的思路有问题?想错了?哪里少根筋了?没啊
端起杯子喝口水,Fuck,果真是脑子进水了。其实这个算周不是根据总天数除以7算的,而是根据时间选择器来的,比如2012-12-31,时间选择器上是2013年的第一周,但是根据需求,我要这个日期是2012年的第54周,所以比如我2013-1-1号是星期二,所以我要再加上一天,这就是为什么要写
1 var firstDate = new Date(dt.getFullYear() + "-01-01");2 alert(firstDate.getDay());3 var diff = firstDate.getDay() - 1;
这几行代码了,其实还是按照时间选择器的周的计算方法来的,只是把年末和年初的周次分别计算到改年的周次和上年的周次里面,通俗点讲吧,就是吧周二加上一天当成是周一来计算。嗨,发现自己真的犯二,其实我现在一边写还是一边晕,估计我写的你们也没看懂。哈哈
好吧,既然写了再来一个C#版的吧,代码如下:
1 int WeekOfYear() 2 { 3 DateTime date = Convert.ToDateTime("2013-10-25"); 4 DayOfWeek dw = (Convert.ToDateTime(string.Format("{0}-1-1 0:0:0", date.Year.ToString()))).DayOfWeek; 5 int day = 0; 6 switch (dw) 7 { 8 case DayOfWeek.Monday: 9 {10 day = 0;11 break;12 }13 case DayOfWeek.Tuesday:14 {15 day = 1;16 break;17 }18 case DayOfWeek.Wednesday:19 {20 day = 2;21 break;22 }23 case DayOfWeek.Thursday:24 {25 day = 3;26 break;27 }28 case DayOfWeek.Friday:29 {30 day = 4;31 break;32 }33 case DayOfWeek.Saturday:34 {35 day = 5;36 break;37 }38 case DayOfWeek.Sunday:39 {40 day = 6;41 break;42 }43 }44 int week = (date.DayOfYear + day) / 7 + 1;45 46 return week;47 }