Учитывая день недели и день, в который оно происходит, могу ли я получить его порядковое положение в постоянном времени? - PullRequest
1 голос
/ 15 сентября 2011

Скажи, что мне дали дату, из которой я могу получить ее день месяца и день недели. Например (в 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 днем ​​недели в месяце. В этом случае я ищу n=2 для второй среды сентября 2011 года.

Наивным алгоритмом было бы найти первое вхождение этого дня недели в месяце, взять разницу в днях и разделить на 7, но это не в постоянном времени. Например, мне нужно будет повторять каждый день с первого дня сентября 7 раз, чтобы достичь первой среды.

Есть ли решение этой проблемы в постоянном времени?

(Для всех, кто интересуется, я пытаюсь сгенерировать порядковые значения для правил повторения iCalendar; учитывая дату, сгенерируйте ежемесячное повторение для n числа каждого месяца. Правило для этого случая будет примерно таким:

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

или

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

)

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

Разделите на 7 и округлите.

14-е всегда является вторым [днем недели] месяца, 15-е всегда является 3-м [днем недели] месяца и т. Д.

1 голос
/ 15 сентября 2011

Вам нужны две функции - одна для получения информации о дне, другая для 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(' ');
}
1 голос
/ 15 сентября 2011

Возьмите день месяца, прибавьте 6 и разделите на 7, отбросив остаток.

...