2 qq 18672093 qq_18672093 于 2015.05.26 15:54 提问

用js判断当前时间是单周还是双周

我想判断当前时间是单周还是双周,用js写了个demo,效果是实现了,但是不知科学否?有没有更好的方法?

 <script>
    document.write('xx科技有限公司放假时间');
    function getDateIndex(){
        var d = new Date(); //实例化时间函数
        var now = d.getTime(); // 获取距 1970 年 1 月 1 日之间的毫秒数
        var n = now - 259200000; // 由于1970.1.1 是星期四,不是星期一,减去后面三天
        //document.write(now);
        var dayIndex = Math.ceil(n / 86400000) - 1; 
        var weekIndex = Math.ceil(dayIndex / 7);
        var ds = weekIndex % 2; // 判断单双周
        //alert(ds);
        var day = d.getDay(); // 返回一周中的某一天
        if(ds == 0){
            switch(day){
                case 0:
                    x ="今天是单周的星期天,干了一周,累成狗,终于可以休息了,只可惜明天就要上班了。。。";
                    break;
                case 1:
                    x ="今天是单周的星期一,才放一天假。。。";
                    break;
                case 2:
                    x ="今天是单周的星期二,才放一天假。。";
                    break;
                case 3:
                    x ="今天是单周的星期三,才放一天假。。";
                    break;
                case 4:
                    x ="今天是单周的星期四,才放一天假。。";
                    break;
                case 5:
                    x ="今天是单周的星期五,才放一天假。。";
                    break;
                case 6:
                    x ="今天是单周的星期六,才放一天假。。";
                    break;
            }
        }else{
            switch(day){
                case 0:
                    x ="今天是双周的星期天,明天要上班了。。。";
                    break;
                case 1:
                    x ="今天是双周的星期一,两天假哦!!";
                    break;
                case 2:
                    x ="今天是双周的星期二,两天假哦!!";
                    break;
                case 3:
                    x ="今天是双周的星期三,两天假哦!!";
                    break;
                case 4:
                    x ="今天是双周的星期四,两天假哦!!";
                    break;
                case 5:
                    x ="今天是双周的星期五,两天假哦!!";
                    break;
                case 6:
                    x ="今天是双周的星期六,放假休息ing,播种好季节!!";
                    break;
            }   
        }
        alert(x);
    }
    window.onload = getDateIndex;
</script>

3个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.05.26 16:17

你关键看你单双周怎么定义的,你这算法是每年的1月1日都是星期一,如果不是星期一计算就出问题了。

 <script>
/**
 * 判断年份是否为润年
 *
 * @param {Number} year
 */
function isLeapYear(year) {
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
/**
 * 获取某一年份的某一月份的天数
 *
 * @param {Number} year
 * @param {Number} month
 */
function getMonthDays(year, month) {
    return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] || (isLeapYear(year) ? 29 : 28);
}26 /**
 * 获取某年的某天是第几周
 * @param {Number} y
 * @param {Number} m
 * @param {Number} d
 * @returns {Number}
 */
function getWeekNumber(y, m, d) {
    var now = new Date(y, m - 1, d),
        year = now.getFullYear(),
        month = now.getMonth(),
        days = now.getDate();
    //那一天是那一年中的第多少天
    for (var i = 0; i < month; i++) {
        days += getMonthDays(year, i);
    }

    //那一年第一天是星期几
    var yearFirstDay = new Date(year, 0, 1).getDay() || 7;

    var week = null;
    if (yearFirstDay == 1) {
        week = Math.ceil(days / yearFirstDay);
    } else {
        days -= (7 - yearFirstDay + 1);
        week = Math.ceil(days / 7) + 1;
    }

    return week;
}
var weekIndex =getWeekNumber(2014,1,6);
var ds = weekIndex % 2; // 判断单双周
alert(ds);
</script>
qq_18672093
qq_18672093   2015.05.26 16:23

不是的,我是通过getTime():返回1970.1.1至今的毫秒数,大家都知道,一天的时间t为86400000毫秒,既然知道总毫秒数allT,那么就可以通过t/allT得到1970.1.1至今为止的总天数allD,那么就可以根据总天数allD/7得到总星期数,假设,第一个星期为单周,则第二个星期就为双周,那么得知总星期数除2取余的值为0时,双周,值为1时则为单周。不知是否合理

danielinbiti
danielinbiti 这还是看你周怎么定义,但你这种跨年的算法肯定存在问题的。每年不是52周就是53周,比如2014年是53周,那2015年第一周应该是单周,如果跨年算,这第一周就是54周,就是双周
2 年多之前 回复
gamefinity
gamefinity   Rxr 2015.05.26 16:32

你相当于是减去1970-1-1的天数,除以7以后,再除2取余。算法是对的,问题是1970-1-1不是星期一,所以你的计算结果应该是有偏差的,你可以试一下上半周和下半周可能单双周的属性不一致

qq_18672093
qq_18672093 有道理!因为我使用的是ceil函数,确实有偏差
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片