2013-04-22 44 views
2

我已經創建了下面的代碼(工作)打印不同的基於指定月份的周事發現降臨周的開始:的Javascript:每年每個

<script language="javascript"> 
<!-- 
var advent; 
mytime=new Date(); 
mymonth=mytime.getMonth()+1; 
mydate=mytime.getDate(); 
if (mymonth==12 && (mydate >= 1 && mydate <= 6)){document.write("xxx"); 
} 
if (mymonth==12 && (mydate >= 7 && mydate <= 13)){document.write("yyy"); 
} 
if (mymonth==12 && (mydate >= 14 && mydate <= 20)){document.write("zzz"); 
} 
if (mymonth==12 && (mydate >= 21 && mydate <= 30)){document.write("qqq"); 
} 
//--> 
</script> 

但我需要這對臨變每年和聖誕節降臨時的變化基於每年聖誕節的降臨時間:

聖誕節前四周的週日復活節開始。聖誕節當天有四個星期天,分別是 。日期從 年份變爲年份,具體取決於聖誕節秋季的哪一天。因此,在2010年,復臨於11月28日開始。 2011年將於11月27日發佈。

我如何計算Advent每週的開始時間?

+2

獲取聖誕節以「日期」的形式。然後從那天起倒退,從中減去1天,並檢查一週中的哪一天。一旦你到達4個星期天,就是這樣。 – Ian 2013-04-22 18:48:26

+0

[_Calendrical Calculations_](http://www.amazon.com/Calendrical-Calculations-Millennium-Edward-Reingold/dp/0521777526)處理很多這類事情,但我沒有我的副本,方便我不知道它是否包含專門用於Roman Advent的算法。 – 2013-04-22 18:55:54

回答

-1

從時代開始,Javascript的工作時間以毫秒爲單位。每週有1000 * 60 * 60 * 24 * 7 = 604800000毫秒。

您可以在JavaScript中創建一個新的日期是從一個已知的日期這樣偏移:

var weekTicks, christmas, week0, week1, week2, week3; 
weekTicks = 604800000; 
christmas = new Date(2013, 12, 25); 
week0 = new Date(christmas - weekTicks); 
week1 = new Date(week0 - weekTicks); 
week2 = new Date(week1 - weekTicks); 
week3 = new Date(week2 - weekTicks); 

查看如何爲你工作。

此外,Date.getDay函數將幫助您找到每月的哪一天是第一個星期日。

+0

我只想評論你的常量:http://infiniteundo.com/post/25326999628/falsehoods-programmers-believe-about-time – Alxandr 2013-04-22 18:57:03

1

這是我在我的評論談到:

function getAdvent(year) { 
    var date = new Date(year, 11, 25); 
    var sundays = 0; 
    while (sundays < 4) { 
     date.setDate(date.getDate() - 1); 
     if (date.getDay() === 0) { 
      sundays++; 
     } 
    } 
    return date; 
} 

DEMO:http://jsfiddle.net/eyUjX/1/

它開始在聖誕節當天,在具體的年份。它進入過去,每天檢查星期日(.getDate()返回0)。遇到其中4個後,循環停止並返回Date

所以要得到2009年的降臨開始,請使用:getAdvent(2009);。它返回一個Date對象,所以你仍然可以使用它的方法。

由於其方法的引用:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

3

開始用日期,聖誕節前夕以前也正是3周。然後,向後走,直到某一天的一週的週日:

function getAdvent(year) { 
    var d = new Date(new Date(year, 12, 24, 0, 0, 0, 0).getTime() - 3 * 7 * 24 * 60 * 60 * 1000); 
    while (d.getDay() != 0) { 
    d = new Date(d.getTime() - 24 * 60 * 60 * 1000); 
    } 

    return d; 
} 

getAdvent(2013); 
// Sun Dec 01 2013 00:00:00 GMT-0600 (CST) 

getAdvent(2012); 
// Sun Dec 02 2012 00:00:00 GMT-0600 (CST) 

getAdvent(2011); 
// Sun Nov 27 2011 00:00:00 GMT-0600 (CST) 

(2013年和2012年進行了測試,並針對日曆驗證了2011 http://usccb.org/反對http://christianity.about.com/od/christmas/qt/adventdates2011.htm驗證)

+0

@Simon感謝您的編輯。 – svidgen 2014-11-20 23:02:42

0

我喜歡這些挑戰,這是如何用遞歸完成的。首先我找到第四個星期天。然後我繼續使用7天,直到我有另外3個。變量firstSunday,secondSunday,thirdSunday和fourthSunday - 包含日期。

編輯:我相信我誤解,但firstSunday變量將是你正在尋找的日期。

Demo

的Javascript

var year = 2011;//new Date().getFullYear(); 
var sevenDays = (24*60*60*1000) * 7; 

var foundDate; 
var findClosestSunday = function(date){ 
    foundDate = date; 
    if (foundDate.getDay() != 0) 
     findClosestSunday(new Date(year,11,date.getDate()-1)); 
    return foundDate; 
} 

var fourthSunday = findClosestSunday(new Date(year, 11, 23)); 
var thirdSunday = new Date(fourthSunday.getTime() - sevenDays); 
var secondSunday = new Date(fourthSunday.getTime() - sevenDays *2); 
var firstSunday = new Date(fourthSunday.getTime() - sevenDays *3); 

console.log 
(
    firstSunday, 
    secondSunday, 
    thirdSunday, 
    fourthSunday 
); 
1

你可以通過添加3天的最後一個星期四在十一月,這似乎得到降臨星期天簡單:

function getAdventDay(y){ 
    var advent=new Date(); 
    advent.setHours(0,0,0,0); 
    //set the year: 
    if(typeof y!='number')y=advent.getFullYear(); 

    //get the last day of november: 
    advent.setFullYear(y,10,30); 

    //back up to the last thursday in November: 
    while(advent.getDay()!==4)advent.setDate(advent.getDate()-1); 

    //add 3 days to get Sunday: 
    advent.setDate(advent.getDate()+3); 

    return advent; 
} 

getAdventDay(2013) 
/* 
Sun Dec 01 2013 00:00:00 GMT-0500 (Eastern Standard Time) 
*/