2015-09-11 58 views
1

我正在做的事情應該很簡單:我得到的字符串代表到期日期並使用JavaScript來確定過期日期是否已過時。我的方法是如下:比較不帶時區的javascript日期

var dateStringFromJson = "2015-09-11T11:21:48.113"; 
var expirationDate = new Date(Date.parse(dateStringFromJson)); 
if (expirationDate > new Date()) { 
    // Expiration not up 
} 

如果我執行在到期前的這個時間的功能,說上午10:50,比較會失敗,彷彿到期日期是該功能將採取行動。

我相信這個問題與JavaScript的時區轉換有關。我使用UTC-7,但我的客戶可能位於美國的任何時區,因此特定於時區的修復程序在此處不起作用。除非絕對必要,否則我還不想將像moment.js這樣的外部庫添加到項目中。

回答

2

使用函數來本地化json字符串。當您解析沒有時區的日期字符串時,它假定它是UTC格式。請參閱我的answer以解釋localizeDateStr()函數的工作原理。

function localizeDateStr(date_to_convert_str) { 
 
    var date_to_convert = new Date(date_to_convert_str); 
 
    var local_date = new Date(); 
 
    date_to_convert.setHours(date_to_convert.getHours() + (local_date.getTimezoneOffset()/60)); 
 
    return date_to_convert; 
 
} 
 

 
function checkExpired() { 
 
    var dateString = document.getElementById('date').value; 
 
    var expirationDate = localizeDateStr(dateString); 
 
    if (expirationDate > new Date()) { 
 
    alert("Expiration not up."); 
 
    } else { 
 
    alert("Expired!"); 
 
    } 
 
}
Expiration Datetime: 
 
<input id="date" type="text" value="2015-09-11T11:21:48.113" /> 
 
<button id="btn" onclick="checkExpired()">Is expired?</button>

2

您可以分析,如果手動其格式是一致的日期:

var DATE_STRING = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.(\d{3})$/; 
var match = DATE_STRING.exec(dateStringFromJson); 

var expirationDate = new Date(); 
expirationDate.setFullYear(+match[1]); 
expirationDate.setMonth(+match[2] - 1); 
expirationDate.setDate(+match[3]); 
expirationDate.setHours(+match[4]); 
expirationDate.setMinutes(+match[5]); 
expirationDate.setSeconds(+match[6]); 
expirationDate.setMilliseconds(+match[7]); 

考慮只把時間戳UTC,雖然,這是它是如何解析的。 (並在末尾添加一個Z來表示)。