2

我创建了以下代码(有效)以根据指定月份的周数打印不同的内容:

<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 年将在 11 月 27 日举行。

我如何计算每年降临节的开始时间?

4

6 回答 6

3

从平安夜前 3 周的日期开始。然后,向后走,直到星期几是星期日:

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进行了验证)

于 2013-04-22T19:01:41.480 回答
2

这是我在评论中所说的:

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

演示: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

于 2013-04-22T18:55:03.343 回答
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)
*/
于 2013-04-22T20:54:56.710 回答
1
const getFirstAdvent=function(y){
 const firstAdvent=new Date(y,11,3);
 firstAdvent.setDate(firstAdvent.getDate()-firstAdvent.getDay());
 return firstAdvent;
};

alert(getFirstAdvent(2020)); 
于 2020-01-22T09:53:49.353 回答
0

我喜欢这些挑战,这里是如何通过递归来完成的。首先我找到第四个星期天。然后我一直减去 7 天,直到我有另外 3 天。变量 firstSunday、secondSunday、thirdSunday 和 FourthSunday - 包含日期。

编辑:我相信我误解了,但firstSunday变量将是您要查找的日期。

演示

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
);
于 2013-04-22T19:26:42.747 回答
-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 函数将帮助您找出一个月中的哪一天是第一个星期日。

于 2013-04-22T18:51:50.350 回答