目標:找到本地時間
和UTC時間偏移
,然後按以下格式建構URL。
範例 URL:/Actions/Sleep?duration=2002-10-10T12:00:00−05:00
該格式基於 W3C 推薦。文檔說:
例如,2002-10-10T12:00:00−05:00(2002 年 10 月 10 日中午, 中部夏令時以及美國東部標準時間) 等於 2002-10-10T17:00:00Z,比 2002-10-10T12:00:00Z 晚五小時。
因此,根據我的理解,我需要透過new Date()
來尋找本地時間,然後使用getTimezoneOffset()
函數計算差異,然後將其附加到字串末尾。
使用 format
取得當地時間
var local = new Date().format("yyyy-MM-ddThh:mm:ss"); // 2013-07-02T09:00:00
取得 UTC 時間偏移
var offset = local.getTimezoneOffset() / 60; // 7
建構 URL(僅限時間部分)
var duration = local + "-" + offset + ":00"; // 2013-07-02T09:00:00-7:00
上面的輸出意味著我的當地時間是2013年7月2日上午9點,與UTC相差7個小時(UTC比當地時間早7個小時)
到目前為止,它似乎有效,但是如果 getTimezoneOffset()
傳回負值(例如 -120)怎麼辦?
我想知道在這種情況下格式應該是什麼樣子,因為我無法從 W3C 文件中弄清楚。
P粉8422150062024-03-26 13:16:45
getTimezoneOffset()
傳回您所引用的規格所需格式的相反符號。
此格式也稱為 ISO8601,或更準確地說是 RFC3339。
在此格式中,UTC 以 Z
表示,而所有其他格式均由 UTC 的偏移表示。意義與 JavaScript 相同,但減法的順序相反,因此結果帶有相反的符號。
此外,本地 Date
物件上沒有名為 format
的方法,因此 #1 中的函數將失敗,除非您使用函式庫來實現此目的。請參閱此文件。
如果您正在尋找可以直接使用此格式的庫,我建議嘗試moment.js。事實上,這是預設格式,因此您可以簡單地執行以下操作:
var m = moment(); // get "now" as a moment var s = m.format(); // the ISO format is the default so no parameters are needed // sample output: 2013-07-01T17:55:13-07:00
這是一個經過充分測試的跨瀏覽器解決方案,並且具有許多其他有用的功能。
P粉5459565972024-03-26 12:26:52
這是一個簡單的輔助函數,可以為您格式化 JS 日期。
function toIsoString(date) { var tzo = -date.getTimezoneOffset(), dif = tzo >= 0 ? '+' : '-', pad = function(num) { return (num < 10 ? '0' : '') + num; }; return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' + pad(date.getDate()) + 'T' + pad(date.getHours()) + ':' + pad(date.getMinutes()) + ':' + pad(date.getSeconds()) + dif + pad(Math.floor(Math.abs(tzo) / 60)) + ':' + pad(Math.abs(tzo) % 60); } var dt = new Date(); console.log(toIsoString(dt));