2013-04-22 39 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) 
*/