Javascript:每年都会找到Advent周的开始

时间:2013-04-22 18:46:11

标签: javascript weekend

我创建了以下代码(可以工作),根据指定月份的周数打印不同的代码:

<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>

但是我需要每年改变Advent,并根据每年圣诞节的降临来改变Advent:

  

圣诞节前四周的圣诞节开始。有   在圣诞节的四个星期天,然后是圣诞节。日期从一年开始变化   到一年,取决于圣诞节秋天的哪一天。因此,在   2010年,复临于11月28日开始。 2011年,它将在27日发生   十一月。

如何计算每年圣诞节开始的几周?

6 个答案:

答案 0 :(得分:3)

从圣诞节前三周的日期 Eve 开始。然后,向后走,直到星期日为星期日:

function getAdvent(year) {
  //in javascript months are zero-indexed. january is 0, december is 11
  var d = new Date(new Date(year, 11, 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年根据http://usccb.org/上的日历进行了测试和验证。2011年已针对http://christianity.about.com/od/christmas/qt/adventdates2011.htm进行了验证

答案 1 :(得分: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年的Advent开始,请使用:getAdvent(2009);。它返回一个Date对象,因此您仍然可以使用它的方法。

作为其方法的参考:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

答案 2 :(得分:1)

你可以通过在11月的最后一个星期四增加3天来获得Advent Sunday,这看起来更简单:

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)
*/

答案 3 :(得分:0)

我喜欢这些挑战,这里是如何通过递归来完成的。首先我找到第四个星期天。然后我只是保持缩短7天,直到我有其他3.变量firstSunday,secondSunday,thirdSunday和4thSunday - 包含日期。

编辑:我相信我误会了,但 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
);

答案 4 :(得分:0)

const getFirstAdvent=function(y){
 const firstAdvent=new Date(y,11,3);
 firstAdvent.setDate(firstAdvent.getDate()-firstAdvent.getDay());
 return firstAdvent;
};

alert(getFirstAdvent(2020)); 

答案 5 :(得分:-1)

从epoch开始,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函数可以帮助您查找该月的哪一天是第一个星期日。