2015-05-25 89 views
2

如果我在兼容的瀏覽器(例如Chrome)中使用<input type="datetime-local" />,則從此輸入獲得的值爲不帶時區的ISO時間戳,例如2015-01-31T23:50使用javascript將日期時間本地輸入的值格式化爲用戶區域設置的字符串

然後我想根據用戶的區域設置格式化這個時間戳。例如,我在法國(UTC + 1)的時候,我想:31/01/2015 23:50

當我使用下面的代碼,時間戳被解釋爲UTC,我得到這個日期:1/2/2015 00:50 UTC+1

new Date(timestamp).toLocaleDateString(navigator.language, { 
    year: "numeric", month: "numeric", day: "numeric", 
    hour: "numeric", minute: "numeric", 
    timeZoneName: "short" 
}) 

我可以使用new Date().getTimezoneOffset()讀取時區偏移量,將其轉換爲字符串ISO時區,然後將其附加到時間戳,但對我來說似乎相當複雜。

什麼會更簡單,純js或jquery(沒有其他庫)的解決方案,以我想要的方式格式化時間戳?

回答

1

您應該繞過所有JavaScript日期格式化函數到最後一刻。

在你的情況下,格式1/01/2015 23:50匹配es-ES或en-GB culture date格式,所以你可以使用函數toLocaleString在一次調用中獲得所需的格式;)。

問題是,如果直接使用new Date()來轉換日期,它會解釋爲ISO-8601格式,這會使事情變得更加困難,所以您應該使用字符串實例化,將其視爲本地日期。

var withOffset = new Date(timestamp).toLocaleString('en-GB'); 
    console.log(withOffset); 

    var withoutOffset= new Date(timestamp.replace('T', ' ')).toLocaleString('en-GB'); 
    console.log(withoutOffset); 

第二個版本將轉化2015-01-31T23:502015-01-31 23:50,這將被解釋爲Sat Jan 31 2015 23:50:00 GMT+0100後的toLocaleString它轉換成你想要的格式。

請注意,這可能不是跨瀏覽器的一致性,因爲你沒有使用標準格式的字符串轉換日期

ECMAScript規範的狀態(我只在Chrome測試吧):如果String不符合標準格式,函數可能會回退到任何特定於實現的啓發式或特定於實現的解析算法。

+0

「2015-01-31 23:50」時間戳不會在FF/Safari中解析,「2015-01-31T23:50」與解釋此小提琴http:// jsfiddle的解釋方式不同。 net/gfouquet/d0L8vnv8 /。我寧願使用便攜式解決方案 – gregfqt

+0

我認爲你應該使用[moment.js](http://momentjs.com/)。這是一個非常強大的庫,用於解析和轉換日期。我提供的解決方案不應該是跨瀏覽器,因爲我之前發佈的不是標準格式。如果你想使用標準格式,那麼你應該使用偏移校正。也許你可以將字符串設置爲標準格式,並且可以跨瀏覽器工作。 – devconcept

相關問題