Golang如何實現節假日不打擾使用者?

壯壯熊發表於2023-01-17

1、場景

想象下以下場景,嘿嘿...!

一個iphone使用者,鬧鐘是可以按節假日不響的!
每日新聞機器人,節假日是可以不打擾我的!
我的業務,節假日是可以...

2、思路

要實現識別節假日,大概有兩種方式:

1、自己收集國家法定節假日資料,離線儲存

優勢:離線簡單

劣勢:新一年要去更新,容易忘記,麻煩

2、呼叫第三方介面資料

優勢:不需要我們操心資料本身

劣勢:有次數限制

本次介紹呼叫第三方介面的方式,用golang實現整個過程。

3、介面分析

分析了網上現有介面,發現juhe的api介面會比較合適,詳細:

https://www.juhe.cn/docs/api/id/606

juhe1.png

分析:

juhe2.png

請求詳情:

請求地址:http://apis.juhe.cn/fapig/calendar/day
請求引數:date=2023-01-16&detail=&key=c6ff98d3**\*\***be4a35b2
請求方式:GET
Header:
   Content-Type:application/x-www-form-urlencoded

返回內容:

{
  "reason":"success",
  "result":{
    "date":"2023-01-16",
    "week":"星期一",
    "statusDesc":"工作日",
    "status":null
  },
  "error_code":0
}

4、golang實現

4.1、json2go小工具

這裡我們利用下json轉golang struct的小工具,把介面返回的json轉成golang的程式碼

https://www.bejson.com/transfor/json2go/

image.png

4.2、程式碼實現

package main

import (
  "encoding/json"
  "fmt"
)

func main() {
  // 當前日期
  todayStr := time.Unix(time.Now().Unix(), 0).Format("2006-01-02")
  key := "xxxxxxx" //獲取,節假日資訊查詢介面 https://dashboard.juhe.cn/data/index/my

  // 判斷當前是否是節假日(週末也算節假日,除非是節假日後補班情況),節假日跳過
  calendarJh := new(util.CalendarJH)
  isHolidays := calendarJh.IsHolidays(&todayStr, &key)
  if isHolidays {
    fmt.Printf("%v 是節假日,今天跳過!\n", todayStr)
    return
  }
}

// IsHolidays 是否是節假日(週末也算節假日,除非是節假日後補班情況)
func (calendarJH *CalendarJH) IsHolidays(date *string, key *string) bool {

  // 預設返回是節假日
  result := true

  // 呼叫juhe api 介面
  juheAPI := "https://apis.juhe.cn/fapig/calendar/day?date=" + *date + "&detail=1&key=" + *key
  body, _ := HttpGetInfo(&juheAPI)
  err := json.Unmarshal(*body, calendarJH)
  if err != nil {
    fmt.Printf("呼叫juhe介面出錯,預設返回是節假日,錯誤原因:%v \n", err)
    return result
  }

  if calendarJH.Result.Status == "1" {
    result = true
    return result
  } else if calendarJH.Result.Status == "2" {
    result = false
    return result
  } else if calendarJH.Result.Status == nil {

    if calendarJH.Result.StatusDesc == "週末" {
      result = true
      return result
    } else if calendarJH.Result.StatusDesc == "工作日" {
      result = false
      return result
    }
  }

  return result
}

// CalendarJH 日曆資料,來自juhe
type CalendarJH struct {
  Reason    string `json:"reason"`
  Result    Result `json:"result"`
  ErrorCode int    `json:"error_code"`
}
type Result struct {
  Date       string      `json:"date"`
  Week       string      `json:"week"`
  StatusDesc string      `json:"statusDesc"` //狀態描述,節假日/工作日/週末。1.當status為1時,表示節假日;2.當status為2時,表示工作日;3.當status為null時,如果week為週六或者週日,表示週末,否則表示工作日
  Status     interface{} `json:"status"`     //當天狀態標識,1:節假日,2:工作日,null:週末或工作日(可根據week進行判斷,也可以直接根據statusDesc進行判斷)
}

最後,若對您有幫助,請關注我,謝謝!

程式猿牧場公眾號.png

相關文章