標準時和夏令時

夏令時

即 Daylight Saving Time,每一年html

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

開始,到markdown

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

爲止。ui

由來

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

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

帶來的問題

  • 每一年一次的「空白1小時」(2020-03-08)orm

  • 兩點整 過了1秒以後是 三點零一分htm

  • 當前時刻:02:00:00 PSTblog

  • 當前時刻:03: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. 首先假設配置的時刻是標準時,拿到時間戳

  2. 經過某些方法判斷時間戳表明的這一刻是不是夏令時

  3. 非夏令時:假設正確,不作任何處理

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

  5. 獲得正確的時間戳

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
複製代碼

參考

《美國時間時區及夏令時簡介》gonglue.us/8593

《UTC和GMT》:www.cnblogs.com/champyin/p/…

相關文章
相關標籤/搜索