鉴于工作日和当月的某一天,我可以在恒定的时间内获得其序数位置吗?

时间:2011-09-14 22:32:53

标签: javascript algorithm date calendar icalendar

说我给了一个约会,从那里我可以得到它的一天和一周中的哪一天。例如(在Javascript中):

var d = new Date(1316038581772); // Wed Sep 14 2011 12:16:21 GMT-1000
var dayOfWeek = d.getDay(); // 3 - Wednesday
var dayOfMonth = d.getDate(); // 14 - Day of month

我正在寻找值n,以便此日期是该月中某一周的n天。在这种情况下,我正在寻找2011年9月第二个星期三的n=2

天真的算法是找到该月中该工作日的第一次出现,取天数之差,除以7,但这不是恒定的时间。例如,我需要从9月的第一天开始每天迭代7次到达第一个星期三。

这个问题是否有恒定时间的解决方案?

(对于任何感兴趣的人,我正在尝试为iCalendar重复规则生成序数值;给定日期,生成每月n天的每月重复。此案例的规则将是像

RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=WE;BYSETPOS=2

RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=2WE

3 个答案:

答案 0 :(得分:2)

除以7并向上舍入。

第14个月总是本月的第2个[工作日],第15个月总是第3个[工作日]等等。

答案 1 :(得分:1)

取月份的日期,加6,除以7,扔掉其余部分。

答案 2 :(得分:1)

您需要两个功能 - 一个用于获取日信息,另一个用于获取第n个信息。

Number.prototype.nth= function(){
    var n= Math.round(this), t= Math.abs(n%100), i= t%10;
    if(i<4 && (t<4 || t> 20)){
        switch(i){
            case 1:return n+'st';
            case 2:return n+'nd';
            case 3:return n+'rd';
        }
    }
    return n+'th';
}
Date.prototype.nthofMonth= function(){
    var today= this.getDate(),m=this.getMonth(),
    day= ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
    'Friday', 'Saturday'][this.getDay()],
    month= ['January', 'February', 'March', 'April', 'May', 'June',
    'July', 'August', 'September', 'October', 'November', 'December'][m];
    return [(m+1)+'-'+today,'the ', (Math.ceil((today)/7)).nth(), day, 'of', month, 'in', this.getFullYear()].join(' ');
}