2013-08-18 138 views
1

我一直在這個腳本的工作,以獲得2日期之間的差異。但是時間會混淆腳本(http://jsfiddle.net/HuGvd/)。2日期jquery日期對象差異

當腳本在當天進入一個新的月份時,腳本停止正常工作。我也試着給這個腳本添加分鐘,沒有運氣真的需要幫助這個人。

function getDateDiff(timestamp) { 
if (null === timestamp || timestamp === "" || timestamp === "undefined") return "?"; 
var splitDate = ((timestamp.toString().split('T'))[0]).split('-'); 
var splitTime = ((timestamp.toString().split('T'))[1]).split(':'); 
var d1 = new Date(); 
var d1Y = d1.getFullYear(); 
var d2Y = parseInt(splitDate[0], 10); 
var d1M = d1.getMonth() + 1; 
var d2M = parseInt(splitDate[1], 10); 
var d1D = d1.getDate(); 
var d2D = parseInt(splitDate[2], 10); 
var d1H = d1.getHours(); 
var d2H = parseInt(splitTime[0], 10); 
var diffInHours = (d1H + 24 * d1D + 30) - (d2H + 24 * d2D + 30); 
if (diffInHours < 24) return diffInHours + " hour"; 
var diffInDays = (d1D + 30 * d1M + 12) - (d2D + 30 * d2M + 12); 
if (diffInDays < 7) return diffInDays + " days"; 
else if (diffInDays >= 7 && diffInDays < 14) return "1 week"; 
else if (diffInDays >= 14 && diffInDays < 30) return Math.floor(diffInDays/7) + " weeks"; 
var diffInMonths = (d1M + 12 * d1Y) - (d2M + 12 * d2Y); 
if (diffInMonths <= 1) return "1 month"; 
else if (diffInMonths < 12) return diffInMonths + " months"; 
var diffInYears = Math.floor(diffInMonths/12); 
if (diffInYears <= 1) return "1 year"; 
else if (diffInYears < 12) return diffInYears + " years"; 
} 

回答

1

日期/時間功能非常複雜,邊緣情況比您可能覆蓋的更多...不要推出自己的解決方案,使用內置功能。你可以找到的毫秒數在JavaScript中的兩個日期這樣之間:

var now = new Date(); 
var then = new Date(timestamp); 

var diffMS = now - then;  

從那裏,這不是太難以轉化爲任何單位你要根據你想如何顯示它。

http://jsfiddle.net/AMDXq/

作爲一個方面說明,這是一個相當普遍的問題。我沒有看,但我確定這裏有一個插件或庫。

+0

我將如何能夠顯示輸出格式,例如1-59分鐘1-23小時1-6天1-4周1-11個月,然後幾年,我變得如此混亂的原因我一直在做的編碼 – user2690217

+0

每次你轉換到一個更大的單位,檢查值,看看你想要顯示該單位或再次轉換。一個簡單的方法是看看你是否有不止一個單位。 –

+0

好的,謝謝你的幫助,我會試試 – user2690217

0

下面是找到兩個日期之間的差異的解決方案。策略是將字符串轉換爲日期對象,然後計算差異並返回一組數值,包括年,月,日等。

我已經爲「精確」添加了一個參數,以便默認情況下它返回一個(例如2013-08-13T23:59:59Z至2013-08-14T00:00:01Z爲一天)或精確(上述差異爲2秒)。

// Expects start date to be before end date 
// Default is to deal in whole days. For precise differences 
// (hours, minutes and seconds), set precise to true 
function dateDifference(start, end, precise) { 
    var timeDiff, years, months, days, hours, minutes, seconds; 

    // Copy date objects so don't modify originals 
    var s = new Date(+start); 
    var e = new Date(+end); 
console.log(s, e); 
    // If not precise, set h,m,s to zero 
    if (!precise) { 
    s.setUTCHours(0,0,0,0); 
    e.setUTCHours(0,0,0,0); 
console.log(s, e); 
    } 

    // Get estimate of year difference 
    years = e.getUTCFullYear() - s.getUTCFullYear(); 

    // Add difference to start, if greater than end, remove one year 
    // Note start from restored start date as adding and subtracting years 
    // may not be symetric 
    s.setFullYear(s.getUTCFullYear() + years); 
    if (s > e) { 
    --years; 
    s = new Date(+start); 
    s.setFullYear(s.getUTCFullYear() + years); 
    } 
    // Get estimate of months 
    months = e.getUTCMonth() - s.getUTCMonth(); 
    months += months < 0? 12 : 0; 

    // Add difference to start, adjust if greater 
    s.setUTCMonth(s.getUTCMonth() + months); 
    if (s > e) { 
    --months; 
    s = new Date(+start); 
    s.setUTCFullYear(s.getUTCFullYear() + years); 
    s.setUTCMonth(s.getUTCMonth() + months); 
    } 

    // Get remaining time difference 
    timeDiff = e - s; 
    days  = timeDiff/8.64e7 | 0; 
    hours = (timeDiff % 8.64e7)/3.6e6 | 0; 
    minutes = (timeDiff % 3.6e6)/6e4 | 0; 
    seconds = ((timeDiff % 6e4)/1e3).toFixed(3); 
console.log(years, months, days, hours, minutes, seconds); 
    return [years, months, days, hours, minutes, seconds]; 
} 

// Simple caluculation of days between two ES5 date objects 
function daysDifference(start,end) { 
    return ((end - start)/8.64e7).toFixed(2); 
} 

// Expects input in ISO8601 format: yyyy-mm-ddThh:mm:ss.sssZ 
function dateFromString(s) { 
    s = s.split(/\D/); 
    s[6] = s[6]? ('0.'+ s[6]) * 1000 : 0; 
    return new Date(Date.UTC(s[0],--s[1],s[2],s[3],s[4],s[5],s[6])); 
} 

function getDateDiff(start, end, precise) { 
    var d = dateDifference(dateFromString(start), dateFromString(end), precise); 
    return d[0] + ' years, ' + d[1] + ' months, ' + d[2] + ' days' + 
     (precise? ', ' + d[3] + ' hours, ' + d[4] + ' minutes and ' + d[5] + ' seconds' : '') ; 
} 

function getDaysDiff(start, end) { 
    var d = daysDifference(dateFromString(start), dateFromString(end)); 
    return d + ' days'; 
} 

</script> 

<!-- Some HTML to show how to use it --> 
<form onsubmit="this.doCalc.onclick(); return false;"> 
    <label for="startDate">Start date (yyyy-mm-dd)<input name="startDate" id="startDate" 
    value="2012-08-09T22:15:03.22" size="25"></label> 
    <br> 
    <label for="endDate">End date (yyyy-mm-dd)<input name="endDate" id="endDate" 
    value="2013-08-13T12:10:03.22" size="25"></label> 
    <br> 
    <label for="dateDifference">Date difference: <input name="dateDifference" readonly size="100"></label> 
    <br> 
    <label for="daysDifference">Days difference: <input name="daysDifference" readonly size="100"></label> 
    <br> 
    <label for="precise"><input type="checkbox" value="precise" name="precise" id="precise">Precise?</label> 
    <br> 
    <input type="button" value="Calculate…" name="doCalc" onclick=" 
    this.form.dateDifference.value = getDateDiff(this.form.startDate.value, this.form.endDate.value, 

this.form.precise.checked); 
    this.form.daysDifference.value = getDaysDiff(this.form.startDate.value, this.form.endDate.value); 
    "> 
    <input type="reset"> 
</form>