您當前的位置:首頁 > 文化

標準時和夏令時

作者:由 竹昍 發表于 文化時間:2022-04-11

夏令時

即 Daylight Saving Time,每年

3月第2個星期日凌晨02:00

開始,到

11月第1個星期日凌晨02:00

為止。

由來

夏令時開始後,時鐘會撥快一個小時,據說其本意是讓人們早睡早起,以達到節約能源的目的 —— 早點睡就不用開燈了嘛。夏令時的另一個功用,是讓人們在下班後,有足夠的時間與孩子們在戶外玩耍。春夏回暖,是戶外活動的好季節。調成夏令時後,即使是晚上8點,外頭仍舊有足夠的亮度,讓孩子們安全玩耍。

夏令時在11月才結束的原因也是為了兒童安全。10月31日是萬聖節,小孩子晚上會出去討糖果,因為是夏令時,晚上7、8點小孩子出去的時候,天色還夠亮,家長也放心些。

帶來的問題

每年一次的“空白1小時”(2020-03-08)

兩點整 過了1秒之後是 三點零一分

當前時刻:0

2

:00:00

PST

當前時刻:0

3

:00:00

PDT

當前時刻的下一秒:03:00:01

PDT

每年一次的“重複1小時”(2020-11-01)

一點到兩點過完之後會再次經過一邊

01:00:00 DST —— 02:00:00

DST

01:00:00 PST —— 02:00:00

PST

我們的問題

描述:運營在配置排期的時候會選擇:年、月、日、時、分、秒(含義: 美國當地時間xxxx-xx-xx xx:xx:xx)

前提:

在需要我們自己處理排期邏輯的情況下(氛圍直出)

運營配置視覺化,不要配置時間戳之類的

我們不希望運營感知到夏令時的存在(歷史處理方式: 選擇 -800 或者 -700)

如何解決

首先假設配置的時刻是標準時,拿到時間戳

透過某些方法判斷時間戳代表的這一刻是否是夏令時

非夏令時:假設正確,不做任何處理

夏令時:假設不正確,還原1小時時差的時間戳

得到正確的時間戳

Node服務端獲取某年夏令時的起止時間

var moment = require(‘moment-timezone’);

// 夏令時開始時間(包含此時間點)【標準時 ——> 夏令時】

function getDSTStartTimestamp(year) {

const str = `${year}-03-01 02:00:00 -800`;

const d = new Date(str);

const m = moment(d)。tz(“America/Los_Angeles”);

let weekday = m。weekday();

if (weekday === 0) {

weekday = 7;

}

const offsetDay = 7 * 2 - weekday;

const timestamp = d。getTime() + offsetDay * 24 * 60 * 60 * 1000;

return timestamp;

}

// 夏令時結束時間(不包含此時間點)【夏令時 ——> 標準時】

function getDSTEndTimestamp(year) {

const str = `${year}-11-01 02:00:00 -700`;

const d = new Date(str);

const m = moment(d)。tz(“America/Los_Angeles”);

let weekday = m。weekday();

if (weekday === 0) {

weekday = 7;

}

const offsetDay = 7 - weekday;

const timestamp = d。getTime() + offsetDay * 24 * 60 * 60 * 1000;

return timestamp;

}

const s = getDSTStartTimestamp(‘2020’);

const e = getDSTEndTimestamp(‘2020’);

const startDate = moment(new Date(s))。tz(“America/Los_Angeles”);

const endDate = moment(new Date(e))。tz(“America/Los_Angeles”);

console。log(‘startDate’, s, startDate, startDate。isDST());

// 夏令時開始時間:startDate 1583661600000 Moment<2020-03-08T03:00:00-07:00> true

console。log(‘endDate’, e, endDate, endDate。isDST());

// 夏令時結束時間:endDate 1604221200000 Moment<2020-11-01T01:00:00-08:00> false

參考

《美國時間時區及夏令時簡介》

https://

gonglue。us/8593

《UTC和GMT》:

https://www。

cnblogs。com/champyin/p/

12767852。html

標簽: 00  夏令時  const  WEEKDAY  02