我有一個 JavaScript 函式,它接受一個數字(1-31),創建一個Date并通過AJAX請求將其發送到服務器:
sendDate(d) {
let date = new Date(this.year, this.month, d);
htmx.ajax("GET", "/some/url", { values: { "date": date.toISOString() } });
}
問題是,JavaScript 正在做一些時區校正,其效果是,如果我創建一個日期,就像new Date(2022, 09, 14)我得到一個Wed Sep 14 2022 00:00:00 GMT 0200 (Central European Summer Time)轉換為 ISO 格式的日期一樣2022-09-13T22:00:00.000Z,即。前一天。
我知道我可以使用.toLocaleDateString(),但我想堅持使用 ISO 格式,并且我還想避免使用 hacky 解決方案,例如總是在一天中的某個指定時間創建日期或其他任何時間。
有沒有一種簡單的方法來創建常規日期物件并將其傳遞到沒有時區惡作劇的服務器?
uj5u.com熱心網友回復:
有一種方法可以做到這一點:將日期存盤為 UNIX 時間戳。我這樣做,當需要時,我將時間戳從服務器傳遞到客戶端并將其轉換為本地日期。
也就是說,我認為在客戶端構建日期并將其傳遞給服務器并不是一個好主意,因為它可以在客戶端進行修改。我相信它主要是通過這種方式完成的(在我的專案中也是如此):在服務器端,您檢查當前時間戳(在發送請求時)并隨心所欲地處理它。
您似乎允許您的用戶選擇一個日期。將其轉換為時間戳并將其傳遞給服務器將是一個好方法。
你會怎么做?如果我回傳
date.getTime()然后決議它(在 python 中),datetime.fromtimestamp(int(request.GET['date']) / 1000)我仍然會遇到相同的時區問題......
在這種情況下,您不會有任何問題 - 除了您的服務器可能碰巧有不同的本地時間。與時區無關的解決方案必須使用utcfromtimestamp而不是fromtimestamp.
無論哪種方式,時間戳本身都不能有??任何定義的時區問題。
uj5u.com熱心網友回復:
這會給你想要的結果嗎?
sendDate(d) {
let date = new Date(this.year, this.month, d, 0, -new Date().getTimezoneOffset());
htmx.ajax("GET", "/some/url", { values: { "date": date.toISOString() } });
}
不那么優雅,但您可以按照您期望的格式創建字串,然后從值中確定日期:
sendDate(d) {
let date = `${this.year}-${String(this.month).padStart(2, '0')}-${String(d).padStart(2, '0')}T00:00:00.000Z`
date = new Date(date)
htmx.ajax("GET", "/some/url", { values: { "date": date.toISOString() } });
}
編輯:
function myFunction() {
let year = 2022
let month = 6 - 1
let day = 25
let date = new Date(year, month, day, 0, -new Date().getTimezoneOffset());
console.log(date.toISOString())
};
function myFunction2() {
let year = 2022
let month = 6
let day = 25
let date = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}T00:00:00.000Z`
date = new Date(date)
console.log(date.toISOString())
};
myFunction();
myFunction2();
uj5u.com熱心網友回復:
傳遞給 Date 建構式的值被視為本地值,toISOString使用 UTC。不幸的是,ECMAScript 沒有無時區、僅限日期的形式。
如果您想使用toISOString格式化時間戳,那么一種解決方案是最初將值決議為 UTC,例如
sendDate(d) {
let date = new Date(Date.UTC(this.year, this.month, d));
htmx.ajax("GET", "/some/url", { values: { "date": date.toISOString() } });
}
例子:
let d = new Date()
let year = d.getFullYear();
let month = d.getMonth()
let day = d.getDate();
let date = new Date(Date.UTC(year, month, day))
// Always shows the current local date as 00:00:00Z
console.log( date.toISOString() );
您還應該從末尾修剪 Z,因為時間戳確實是本地的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/457185.html
標籤:javascript 日期 时区
