2013-04-22 7 views
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가 변경됩니다.

성탄절은 크리스마스 일 4 주 전에 일요일에 시작됩니다. 성령 강림절에는 일요일 (크리스마스 일)에 일요일이 있습니다. 크리스마스 요일에 따라 요일에 따라 연도가 에서 1 년으로 바뀝니다. 따라서 2010 년에 Advent는 11 월 28 일에 시작되었습니다. 2011 년 11 월에 에 27 번 발생합니다.

매년 강림절이 시작될 때 어떻게 계산합니까?

+2

크리스마스 날 가져 'Date' 형태로 나타납니다. 그런 다음 그날부터 거꾸로 작업하여 하루를 빼고 요일을 확인하십시오. 4 일요일에 도착하자마자 바로 그거야. – Ian

+0

[_Calendrical Calculations_] (http://www.amazon.com/Calendrical-Calculations-Millennium-Edward-Reingold/dp/0521777526)는 이러한 종류의 것을 많이 다루지 만 사본을 손쉽게 가지고 있지는 않습니다. 그것이 로마 제국을위한 알고리즘을 특별히 포함하고 있는지 나는 모른다. –

답변

-1

자바 스크립트는 시간별 밀리 초 단위로 작동합니다. 1 주일에 1000 * 60 * 60 * 24 * 7 = 604800000 밀리 초가 있습니다. 당신을 위해 작동하는 방법

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

그것은 특정 연도에, 크리스마스 날에 시작됩니다. 일요일 (일가 0를 반환하는 곳에)를 검사하면서, 그것은 날마다 과거로 간다. 4 개가 발생하면 루핑이 중지되고 Date이 반환됩니다.

Advent의 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://christianity.about.com/od/christmas/qt/adventdates2011.htm에 대해 확인 된 http://usccb.org/ 2011 년 달력에 대해 확인했다)

+0

@Simon 편집 해 주셔서 감사합니다. – svidgen

0

나는 이러한 문제를 사랑 재귀를 사용하여이를 수행하는 방법은 다음과 같습니다. 먼저 네 번째 일요일을 찾습니다. 그 다음에 나는 다른 것을 가질 때까지 7 일을 계속 사용합니다. 3. 변수 firstSunday, secondSunday, thirdSunday 및 fourthSunday - 날짜를 포함합니다.

편집 : 내가 오해 생각하지만, firstSunday 변수가 당신이 찾고있는 일이 될 것이다.

Demo

자바 스크립트 당신은 보이는 11 월의 마지막 목요일에 3 일 추가 강림절 일요일를 얻을 수 있습니다

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

간단 :

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