2014-01-23 8 views
4
var businessDays = 10; // this will come from a form 
var counter = 0; // I have a counter 
var safety = 0; // I have a safety variable 
var ship = today = new Date(); // I have the current date and an initialized shipping variable but the buy date will come from a form 

while(++safety <30){ 
ship.setDate(safety); // add a number of days 
switch(ship.getDay()){ 

    case 0: // Sunday 
    case 6: // Saturday 

    break; 

    default: 
     counter++; 
    } 

if(counter >= businessDays) break; 

} 

// the expected shipping date 

console.log(">>> today = " + today); 
console.log(">>> days = " + businessDays); 
console.log(">>> ship = " + ship); 

문제는 : 내가 이베이에서 물건을 살 때 배송이 7-10 일 (영업일 기준)이며 나에게 배달되기 전 날짜와 영업일을 기재 한 경우 유효한 날짜를 받아야하지만, 안돼. 구입일로부터 7-10 영업일이 아닌 올해 1 월초에있는 날짜가 표시됩니다.JavaScript로 영업일을 어떻게 추가합니까?

답변

1

감사합니다, 나는 열심히 오랫동안 나는이를 위해 제작 된 접근 방식을 통해 다시 생각했고 ...이 작은 수를 함께했다

var businessDays = 7, counter = 0; // set to 1 to count from next business day 
while(businessDays>0){ 
    var tmp = new Date(); 
    tmp.setDate(tmp.getDate() + counter++); 
    switch(tmp.getDay()){ 
      case 0: case 6: break;// sunday & saturday 
      default: 
       businessDays--; 
      }; 
} 

나는 dea는 영업일로 시작하여 영업일의 범위에 해당하는 날마다 0으로 거꾸로 계산했습니다. 이 스위치를 사용하면 한 사람이 영업일 기준으로 하루를 선언 할 수 있습니다. 예를 들어 월요일에 근무하지 않을 수 있으므로 사례 1을 추가하면 월요일이 포함됩니다.

이것은 간단한 스크립트이며 공용 또는 은행 공휴일을 고려하지 않아 훨씬 복잡한 스크립트를 요구할 것입니다.

결과는 배송 날짜로 설정된 날짜이므로 사용자는 원하는 형식으로 날짜 정보를 추출 할 수 있습니다 (예 :

var shipDate = tmp.toUTCString().slice(1,15); 
0
ship.setDate(safety); // add a number of days 

일을 추가하지 않습니다. 그것은 하루를 설정합니다. 더 많은 정보 : 문제는 당신이었다

ship.setDate(ship.getDate() + safety); 

ship.setDate(safety); // add a number of days 

에서

ship.setDate(ship.getDate()+1); 
+0

저는이 캠프에 없지만 일부 사람들은 실제로 w3schools가 싫어서 많은 어려움을 줄 것입니다. 나는 사람들이 논평에서 이것을 논하기 시작했기 때문에 한때 질문을 잠 갔다. 그것을 대체하는 것이 좋습니다. – rvighne

+0

감사합니다. Mozilla에 대한 링크로 바 꾸었습니다. – anthonygore

0

변경 행 7 :

당신이 일 추가하려면 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate 이런 식으로 뭔가를 할 일을 추가하고 싶으면 설정하지 않습니다.

+0

나는 기존의 날짜 참조에 추가 할 때 실제로 그날을 설정하고 싶습니다. 그렇지 않으면 이것을 무시할 주말인지를 확인할 수 있습니다. 그렇지 않으면 무시할 수 있습니다. 이 기능은 단순하고 공휴일이나 은행 휴일을 고려하지 않으므로 요즘 계정에 추가 테스트가 수행되어야합니다. 그러나 각 국가마다 다른 공휴일이 있기 때문에 개별 국가에 따라 달라질 수 있습니다. 이 날짜에 적절한 기능을 테스트하고 작성하십시오. –

0

당신의 가장 큰 문제는 때마다 대신 1 그래서 첫 번째 루프 = 1의 여러 일을 그것을 반복 할 때마다 추가 된 의미의 안전을 추가, 초 = 1 + 2 등

나는이 작품을 믿고 있었다 당신이 원하는만큼 : 귀하의 의견들에 대한

var businessDays = 10; // this will come from a form 
var counter = 0; // I have a counter 
var safety = 0; // I have a safety variable 
var ship = today = new Date(); // I have the current date and an initialized shipping variable but the buy date will come from a form 
console.log(">>> today = " + today); 
// now the loop... 

while(++safety <30){ 
ship.setDate(ship.getDate()+1); 
switch(ship.getDay()){ 

    case 0: // Sunday 
    case 6: // Saturday 

    break; 

    default: 
     counter++; 
    } 

if(counter >= businessDays) break; 

} 
    // add a number of days 
// the expected shipping date 


console.log(">>> days = " + businessDays); 
console.log(">>> ship = " + ship); 
+0

나는 그가 * 여러 날을 추가하기를 원한다고 생각한다. – rvighne

+0

while 루프를 통해 여러 요일이 추가됩니다. 제가 올바르게 이해한다면,이 코드는 오늘 날짜를 받고 10 일 (영업일 기준) 걸리는 것으로되어 있습니다. 따라서 오늘 이후 모든 날을 살펴보면 일요일/토요일 제외 : 10 일 (영업일 기준)이 2 월 5 일이며,이 고정 버전의 결과입니다. – Rhyono

1

검색 입력의 기본값이 영업일 기준 또는 1 주일 전의 기본값입니다. 다음은 앞뒤 모두에서 작동하는 것입니다.

// add (or subtract) business days to provided date 
addBusinessDays = function (startingDate, daysToAdjust) { 
    var newDate = new Date(startingDate.valueOf()), 
     businessDaysLeft, 
     isWeekend, 
     direction; 

    // Timezones are scary, let's work with whole-days only 
    if (daysToAdjust !== parseInt(daysToAdjust, 10)) { 
     throw new TypeError('addBusinessDays can only adjust by whole days'); 
    } 

    // short-circuit no work; make direction assignment simpler 
    if (daysToAdjust === 0) { 
     return startingDate; 
    } 
    direction = daysToAdjust > 0 ? 1 : -1; 

    // Move the date in the correct direction 
    // but only count business days toward movement 
    businessDaysLeft = Math.abs(daysToAdjust); 
    while (businessDaysLeft) { 
     newDate.setDate(newDate.getDate() + direction); 
     isWeekend = newDate.getDay() in {0: 'Sunday', 6: 'Saturday'}; 
     if (!isWeekend) { 
      businessDaysLeft--; 
     } 
    } 
    return newDate; 
}; 

선택 사항 인 휴일 데이터 구조를 쉽게 통과하고 조정할 수 있습니다.

그러나 공휴일 데이터 구조를 생성하는 것은 약간의 노력이 필요하며 모든 국가와 지역뿐만 아니라 모든 조직에 적합합니다.

4

필자는 연말 연시 및 미국 연방 공휴일을보다 잘 다루기 위해 Mark Giblin의 개정 된 코드를 수정했습니다. 아래 참조 ...

function businessDaysFromDate(date,businessDays) { 
    var counter = 0, tmp = new Date(date); 
    while(businessDays>=0) { 
    tmp.setTime(date.getTime() + counter * 86400000); 
    if(isBusinessDay (tmp)) { 
     --businessDays; 
    } 
    ++counter; 
    } 
    return tmp; 
} 

function isBusinessDay (date) { 
    var dayOfWeek = date.getDay(); 
    if(dayOfWeek === 0 || dayOfWeek === 6) { 
    // Weekend 
    return false; 
    } 

    holidays = [ 
    '12/31+5', // New Year's Day on a saturday celebrated on previous friday 
    '1/1',  // New Year's Day 
    '1/2+1', // New Year's Day on a sunday celebrated on next monday 
    '1-3/1', // Birthday of Martin Luther King, third Monday in January 
    '2-3/1', // Washington's Birthday, third Monday in February 
    '5~1/1', // Memorial Day, last Monday in May 
    '7/3+5', // Independence Day 
    '7/4',  // Independence Day 
    '7/5+1', // Independence Day 
    '9-1/1', // Labor Day, first Monday in September 
    '10-2/1', // Columbus Day, second Monday in October 
    '11/10+5', // Veterans Day 
    '11/11', // Veterans Day 
    '11/12+1', // Veterans Day 
    '11-4/4', // Thanksgiving Day, fourth Thursday in November 
    '12/24+5', // Christmas Day 
    '12/25', // Christmas Day 
    '12/26+1', // Christmas Day 
    ]; 

    var dayOfMonth = date.getDate(), 
    month = date.getMonth() + 1, 
    monthDay = month + '/' + dayOfMonth; 

    if(holidays.indexOf(monthDay)>-1){ 
    return false; 
    } 

    var monthDayDay = monthDay + '+' + dayOfWeek; 
    if(holidays.indexOf(monthDayDay)>-1){ 
    return false; 
    } 

    var weekOfMonth = Math.floor((dayOfMonth - 1)/7) + 1, 
     monthWeekDay = month + '-' + weekOfMonth + '/' + dayOfWeek; 
    if(holidays.indexOf(monthWeekDay)>-1){ 
    return false; 
    } 

    var lastDayOfMonth = new Date(date); 
    lastDayOfMonth.setMonth(lastDayOfMonth.getMonth() + 1); 
    lastDayOfMonth.setDate(0); 
    var negWeekOfMonth = Math.floor((lastDayOfMonth.getDate() - dayOfMonth - 1)/7) + 1, 
     monthNegWeekDay = month + '~' + negWeekOfMonth + '/' + dayOfWeek; 
    if(holidays.indexOf(monthNegWeekDay)>-1){ 
    return false; 
    } 

    return true; 
} 
관련 문제