2013-04-22 3 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, Адвент начался 28 ноября. В 2011 году это произойдет на 27 Ноябрь.

Как рассчитать, когда недели Адвента начинаются каждый год?

+2

Получить Рождество в форме «Дата». Затем откидывайтесь назад с этого дня, вычитая 1 день из него и проверяя день недели. Как только вы достигнете 4 воскресенья, вот и все. – Ian

+0

[_Calendrical Calculations_] (http://www.amazon.com/Calendrical-Calculations-Millennium-Edward-Reingold/dp/0521777526) имеет дело с множеством таких вещей, но у меня нет моей копии, Я не знаю, включает ли он алгоритм специально для римского пришествия. –

ответ

-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

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 были протестированы и проверены на календаре на http://usccb.org/ 2011 была проверена против http://christianity.about.com/od/christmas/qt/adventdates2011.htm)

+0

@Simon Спасибо за редактирование. – svidgen

0

Я люблю эти проблемы, вот как это можно сделать с рекурсией. Сначала я нахожу четвертое воскресенье. Затем я просто продолжаю минус 7 дней, пока у меня не будет другого. Переменные firstSunday, secondSunday, thirdSunday и 4thSunday - содержат даты.

EDIT: Я считаю, что я не понял, но 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) 
*/