golang根據配置的時間和時區計算定時任務是否到了重新整理時間

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

    • 起因
    • 思路
    • 細化
    • 遺留問題

起因

  很多時候我們會碰到這樣的需求,每天某個時候需要定時執行某個任務,比如定時發郵件、定時發推送訊息等,而這個定時是針對當地時間的,比如每天中午12點發推送訊息給玩家提醒可以上線領金幣啦。
  然而,中國的12點和越南的12點就不是同一個12點,所以需要通過時區計算是否到了該執行任務的時候。

思路

  先來看一下如何根據時區計算約定的時間。假設現在需要晚上20點,執行任務,時區為西3時區。首先產生一個格林威治時間的20點

utcTime := time.Now().UTC()targetTime :=time.Date(utcTime.Year(),utcTime.Month(),utcTime.Day(),20, 0, 0, 0, utcTime.Location())

  由於西3時區比格林威治時間慢3個小時,等西3時區20點的時候,格林威治時間就是20點再過3小時,對應的格林威治時間就是

targetTime.Unix() + 3 * 3600

而如果是東8時區到20點的時候,格林威治時間還差8小時才到20點,則對應的時間是

targetTime.Unix() - 8 * 3600

細化

先對重新整理時間的配置定義一個結構

type RefreshConfig struct {    TargetHour      int    TargetMinute    int    Targetsecond    int    Offset          int64    lastRefreshTime int64}

定義了定時任務執行的時分秒,offset表示在格林威治時間對應的時分秒基礎上做多少位移能得到本地的目標時間。offset定義如下

var zoneToOffset = map[string]int64{    "Z0":  0,    "E1":  -1 * 3600,    "E2":  -2 * 3600,    "E3":  -3 * 3600,    "E4":  -4 * 3600,    "E5":  -5 * 3600,    "E6":  -6 * 3600,    "E7":  -7 * 3600,    "E8":  -8 * 3600,    "E9":  -9 * 3600,    "E10": -10 * 3600,    "E11": -11 * 3600,    "E12": 12 * 3600,    "W1":  1 * 3600,    "W2":  2 * 3600,    "W3":  3 * 3600,    "W4":  4 * 3600,    "W5":  5 * 3600,    "W6":  6 * 3600,    "W7":  7 * 3600,    "W8":  8 * 3600,    "W9":  9 * 3600,    "W10": 10 * 3600,    "W11": 11 * 3600,    "W12": 12 * 3600,}

E8對應東8區,W3對應西3區,參照前文的計算方式。
通過一下代碼計算是否達到(或者超過了)當地的執行時間

func TimeIsUp(refreshConfig *RefreshConfig) bool {    targetTime := getTargerTime(refreshConfig.TargetHour,        refreshConfig.TargetMinute,        refreshConfig.Targetsecond,        refreshConfig.Offset)    return refreshConfig.lastRefreshTime < targetTime &&        time.Now().Unix() >= targetTime}

定時任務執行以後,需要把lastRefreshTime設定為目前時間。
完整內容查看github上的代碼

遺留問題

  對於夏令時的計算,暫時沒找到比較好的辦法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.