2016-04-10 29 views
2

我得到一個SQL日期 - NOT日期時間 - 對象推入我的Javascript代碼,我需要看看它是否在今天之前。這裏是我的代碼(相關部分):Javascript日期比較行爲不如預期

todaysDate = new Date(); 
todaysDate.setHours(0,0,0,0); 
var date = Date.parse(row[3]); 
// date.setHours(0,0,0,0); 
if (date < todaysDate) { 
    alert("date is before today"); 
    dueDate = '<small class="text-danger">'; 
} else { 
    alert("date is after today"); 
    dueDate = '<small class="text-muted">'; 
} 

row [3]是SQL日期的來源。所以,除了今天的日期以外,這一切都可以正常工作。如果沒有評論的話,它認爲今天的日期已經過去了。使用註釋行,我的代碼中斷了。任何想法如何解決這個問題?不知道我做錯了什麼。

謝謝!

+0

今天應該是文字危險還是文字靜音?你有沒有試過'新日期(行[3])'? –

+0

使用Date構造函數和* Date.parse *解析字符串是不可靠的,並且通常會產生意外的結果。如果你不透露'row [3]'的實際值,就不可能說出可能發生的事情。請注意,在符合ECMAScrip 2015的瀏覽器中,像「2016-04-10」這樣的字符串將被視爲UTC,因此如果您位於UTC以西,則可能會獲得4月9日的日期。另外,有些人仍然認爲它是本地的,有些則是無效的。 – RobG

+0

是@RobG它是你提到的字符串格式 - YYYY-MM-DD,所以我認爲這是你提到的UTC問題。我會檢查你在下面發佈的代碼!而丹尼爾,澄清,今天應該是平靜的,而不是危險。我希望今天不要被包含在第一個if語句中。 – dangr

回答

3

如果您的日期字符串類似於「2016-04-10」,並且您的時區在GMT以西,例如-04:00,那麼在符合ECMAScript 2016的瀏覽器中,您將收到「2016-04- 09T19:00:00-0400" 。

當您使用new Date()創建日期並將小時數設置爲零(假設您的年齡是4月10日),則會得到日期「2016-04-10T00:00:00-0400」。

所以當比較他們有不同的時間值。

你需要的是要麼把你從數據庫中本地得到字符串,或讓你所在的UCT日期,所以:

var dateString = '2016-04-10'; 
 
var parsedDate = new Date(dateString); 
 

 
var todayUTCDate = new Date(); 
 
todayUTCDate.setUTCHours(0,0,0,0); 
 

 
document.write(parsedDate + '<br>' + todayUTCDate);

不是所有瀏覽器根據ECMAScript 2015解析字符串,因此應始終手動解析它們。使用庫或寫一個小功能,例如

// Parse date string in format 'yyyy-mm-dd' as local date 
function parseISOLocal(s) { 
    var b = s.split(/\D/); 
    return new Date(b[0], b[1]-1, b[2]); 
} 

和替換:

var date = Date.parse(row[3]); 

與:

var date = parseISOLocal(row[3]); 

,然後在比較,比較時間值:

if (+date < +todaysDate) { 

if (date.getTime() < todaysDate.getTime()) { 
+0

這工作完美 - 謝謝你! – dangr

+0

雖然忘了提及 - 在回覆聲明中缺少的括號,對於後來遇到此問題的任何人都是如此。 – dangr

+0

@ dangr-fixed ... – RobG

0

使用日期對象的getTime()

getTime()方法返回1970年1月1日午夜到指定日期之間的毫秒數。

您可以比較毫秒,做你的作業

date.getTime() > todaysDate.getTime() 

另外要確保Date.parse返回一個有效日期。

+0

這是錯的。 '>','<', '> ='和'<='可以直接適用於日期。 – Chiru