2011-09-14 31 views
1

假設我給了一個日期,從中我可以得到一個月的每一天和一週中的某一天。例如(在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 

回答

2

除以7並向上取整。

第十四始終是本月2日[平日] 15號始終是本月3日[平日]等

1

以該月的一天,加上6,再除以7,扔掉剩餘。

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(' '); 
} 
+0

這是一種很好的方式來獲得我期待的英語短語,但我真的只是在尋找'Math.ceil((今天)/ 7)'部分。如果我今天沒有腦力激盪,我可能會自己偶然發現它。 – tad

相關問題