我這里有一個奇怪的問題。在我正在制作的應用程式中,需要生成一個連續日期字串陣列,其中每個日期字串都是“YYYY-MM-DD”。它作業了很長時間,但在 11 月,我的一位用戶告訴我,應用程式中缺少一個日期,即 2021 年 11 月 7 日。
但是,對于其他人來說,它并沒有缺席。所以我和他一起把問題縮小到下面的代碼。如果我或他在我們的 Chrome 控制臺中運行它,它的行為會有所不同。
// Creates an array of 14 consecutive date strings
function datesInclGaps(date, hour) {
const latest = toUTCDate(date, hour)
const result = []
for (let i = 0; i < 14; i ) {
result.push(fromUTCDate(latest))
latest.setDate(latest.getDate() - 1)
}
return result
}
// Creates a Date object with the given UTC date and the give hour.
const toUTCDate = (date, hour) => {
const match = /(\d\d\d\d)-(\d\d)-(\d\d)/.exec(date)
if (!match) throw new Error('Illegal date format: ' date)
const utc = new Date()
utc.setUTCFullYear( match[1], match[2] - 1, match[3])
utc.setUTCHours(hour, 0, 0, 0)
return utc
}
// Returns a date string YYYY-MM-DD from a Date obj.
// Date assumed to be in UTC.
const fromUTCDate = date => {
const y = date.getUTCFullYear()
const m = pad(date.getUTCMonth() 1)
const d = pad(date.getUTCDate())
return `${y}-${m}-${d}`
}
const pad = (t, p = 2) => t.toString().padStart(p, '0')
console.log('0-hour')
console.log(datesInclGaps('2021-11-14', 0).join(', '))
console.log('12-hour')
console.log(datesInclGaps('2021-11-14', 12).join(', '))
日期串列都應該是 11 月的前 14 天。“小時”引數是我最終“修復”錯誤的方式,因為如果我將它設定為 0,那么這一天對他來說就消失了,但如果它設定為 12,它就可以正常作業。請參閱下面的螢屏截圖。亮模式是他的輸出,有錯誤,暗模式是我運行它時,沒有錯誤。完全相同的簡單純 Javascript 在 chrome 控制臺中運行。


我使用 UTC 版本的原因是確保時區無關緊要。但是……這是我能想到的唯一一件事,這可能是我們之間的區別。我已經為這個問題絞盡腦汁,但我想不出一個很好的理由為什么代碼會這樣!任何見解都會很有用!
uj5u.com熱心網友回復:
發生這種情況是因為您使用getDate: 這是一種適用于本地日期的方法。如果時區差異使得 UTC 午夜時間仍在前一天,getDate則將回傳前一天的日期。但是在夏令時更改的第一天,將本地時間向后移動一小時,以本地時區術語減去 1 天,對應于以 UTC 術語減去 25 小時!
所以我們在某個時刻有這個日期:
8 November 2021, 0:00 UTC
執行時getDate(),日期被解釋為本地日期,在時區 GMT 00 中,沒有夏令時。所以我們得到:
8 November 2021, 0:00 Local Time Zone
然后我們setDate減去 1 天:
7 November 2021, 0:00 Local Time Zone
但是這個日期恰好在夏令時期間,所以它轉換回這個 UTC 日期:
6 November 2021, 23:00 UTC
所以當這個日期被輸出時,它是 11 月 6 日,而不是 11 月 7 日,它被跳過了。
當您看到它時,解決方案非常明顯:您應該使用getUTCDate并且setUTCDate遠離這些方法的非 UTC 變體,因為您使用 UTC 時間初始化了日期。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411000.html
標籤:
