2011-10-06 9 views
1

datejs (date ninja or whathaveyou ..)를 사용하려고하는데 이상한 결과가납니다. 다음은 테스트 할 콘솔로 출력하는 내용입니다.이 글을 잘못 쓰고 있거나 Date.js (date ninja)의 버그입니다

var d1 = Date.today(); 
var d2 = Date.parse(work.tax_credit_start); 
var span2 = new TimeSpan(d2 - d1); 

console.log('result of timespan test = ' + span2.getDays() + 'days between now and ' + Date.parse(work.tax_credit_start).toString('dd-mm-yyyy') + ' - ' + work.tax_credit_start); 

엑셀 및 기타 온라인 서비스의 날짜 계산에 따르면 약 584 일이 걸릴 것으로 예상됩니다. 내가 너무 날짜 뉴질랜드 스타일 datejs위한 현지화 파일을 가지고

result of timespan test = -462days between now and 30-00-2010 - 30-06-2010 

, 그래서 나는 그 문제가 될 것으로 예상하고 있지 않다 : 여기에 내가 가진거야. 그것이 문제인 것으로 보입니다. 또한 날짜를 구문 분석 한 다음 파싱되기 전의 형식과 동일한 문자열로 렌더링하면 그래도 안됩니다.

긴 하루, 어쩌면 나는 휴식이 필요할 것입니다. 생각/인터넷 지원?

답변

0

먼저 30-00-2010은 Wed Dec 30 2009 00:00:00으로 해결됩니다. 그게 네가 정말로 원하는거야?

두 번째로, 30-00-2010과 30-06-2010 사이의 일 차이는 6 개월 이상 며칠, 584 일을 얻는 방법은 무엇입니까? 나는 -182를 얻는다.

어쨌든 어려운 계산은 아닙니다. 필요한 날짜에 대해 두 개의 날짜 객체를 만들고, 시간을 정오로 설정하고 (일광 절약 시간 문제를 제거하기 위해), 다른 날짜에서 하나를 뺀 다음 결과를 밀리 초 단위로 나누십시오 (24 * 60 * 60 * 1000)로 반올림하고 가장 가까운 정수로 반올림합니다.

는 여기에 몇 가지 빠른 기능은 작업을 할 수있다 : (?)

// Iput as d/m/y or d-m-y 
function dmyToDate(s) { 
    var bits = s.split(/[-/]/); 
    return new Date(bits[2], --bits[1], bits[0]); 
} 


// Difference between dates in days. If only one date supplied, 
// today is used for endDate 
// Copy startDate so don't mess it up 
function daysBetweenDates(startDate, endDate) { 

    endDate = typeof endDate == 'string'? dmyToDate(endDate) : new Date(); 
    startDate = typeof startDate == 'string'? dmyToDate(startDate) : new Date(startDate); 
    endDate.setHours(12,0,0); 
    startDate.setHours(12,0,0); 

    var diff = startDate - endDate; 
    var ms = 24 * 60 * 60 * 1000; // or 8.64e7 

    return Math.round(diff/ms); 
} 
+0

아, 시작일이 끝나기 전에 표시가 + ve일까요? – RobG

+0

감사합니다. 많이 감사합니다! – dibs

0

문제는 확실히 당신의 work.tax_credit_start 문자열 값으로 인해 발생합니다. 구문 분석에 실패하면 Datejs 파서는 null 값을 반환합니다.

샘플에 날짜에서 d1을 뺍니다. 예기치 않은 숫자 값이 반환됩니다. 그런 다음 예기치 않은 .days 값을 반환하는 TimeSpan 생성자에 '예상치 못한'숫자를 전달합니다.

다음은 원본의 작동 샘플입니다.

var d1 = Date.parse("2010-01-30"); 
var d2 = Date.parse("2010-06-30"); 

var span2 = new TimeSpan(d2 - d1); 

span2.days // 150 days 

내가 원래 샘플에 대한 몇 가지 권장 사항이 있습니다

당신이 Date.parse()에 문자열 값을 전달하는 그리고 당신은 그 값의 형식을 제어 할 경우
  1. yyyy-MM-dd의 ISO 형식으로 전달하는 것이 가장 좋습니다.
  2. Date 개체가 Date.parse()에서 반환 될 것으로 예상되는 경우 null에 대한 값을 확인하여 실제로 유효한 Date 개체가 있는지 확인하는 것이 가장 좋습니다.

다음은 null 경우 디폴트 값으로 설정 한 후, d1null 값을 확인 보여줍니다.

예는

var d1 = Date.parse("30-00-2010"); // Not a valid Date 

if (!d1) { 
    d1 = new Date(); 
} 

console.log(d1); // will be 'now' 

위의 샘플은 변수를 설정할 때 기본 값을 오른쪽으로 전달하여 정리 될 수있다. 이 도움이

var d1 = Date.parse("30-00-2010") || new Date(); 

console.log(d1); // will be 'now' 

희망.

관련 문제