2011-10-06 77 views
1

我想使用datejs(日期忍者或whathaveyou ..)和我正在奇怪的結果。 下面是我輸出到控制檯進行測試。我寫這個錯誤的或者這是Date.js(日期忍者)的錯誤

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

根據excel和其他在線服務中的日期計算,我預計大約-584天。 這是我的了:

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

我已經得到了datejs新西蘭風格的本地化文件日期了,所以我不希望這是一個問題。雖然它似乎是問題。另外,如果我解析一個日期,然後將它作爲一個字符串呈現,它與解析之前的格式相同,它不應該改變是啊?

漫長的一天,也許我只是需要休息。 您的想法/幫助互聯網?

回答

0

首先,30-00-2010將被解析成星期三2009年12月30日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值。

在您的示例中,將從null日期中減去d1。這將返回一個意外的數字值。然後,您將該「意外」號碼傳遞給TimeSpan構造函數,這將返回一些意想不到的.days值。

這是你原來的工作示例。

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

var span2 = new TimeSpan(d2 - d1); 

span2.days // 150 days 

我對你的原始樣本一對夫婦建議:

  1. 如果你傳遞一個字符串值,爲Date.parse(),你必須控制該值的格式,最好通過ISO格式yyyy-MM-dd
  2. 如果您預計從Date.parse()返回的對象爲Date,最好檢查該值與null以確保您確實擁有有效的Date對象。

下面演示檢查的d1一個null值,這時如果null設置爲默認值。

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' 

希望這有助於。

相關問題