Maison  >  Article  >  développement back-end  >  Comment détecter le changement de fuseau horaire avec Golang ?

Comment détecter le changement de fuseau horaire avec Golang ?

WBOY
WBOYoriginal
2024-06-02 22:17:001010parcourir

Le langage Go fournit une méthode pour détecter les changements de fuseau horaire : Charger l'emplacement initial du fuseau horaire : Utilisez time.LoadLocation pour charger la valeur *time.Location du fuseau horaire spécifié. Recharger périodiquement la position du fuseau horaire : Rechargez périodiquement la position du fuseau horaire, soit en boucle, soit à l'aide d'un timer, et comparez-la à la position initiale. Détecter les changements : si l'emplacement nouvellement chargé est différent de l'emplacement initial, le fuseau horaire a changé.

如何用 Golang 检测时区更改?

Comment détecter un changement de fuseau horaire avec Go ?

Dans les systèmes distribués, les changements de fuseau horaire peuvent entraîner des incohérences et des erreurs. Le langage Go fournit de puissantes bibliothèques pour gérer les fuseaux horaires, notamment la possibilité de détecter les changements de fuseau horaire.

Utilisez la fonction time.LoadLocationtime.LoadLocation

time.LoadLocation 函数加载指定时区的位置,并返回 *time.Location

    time.LoadLocation pour charger l'emplacement dans le fuseau horaire spécifié et renvoyer le *time.Location code> valeur. Cette valeur contient le décalage du fuseau horaire, le nom abrégé et d'autres informations. Pour détecter les changements de fuseau horaire, suivez les étapes suivantes : <li><p></p></li>Chargez la position initiale du fuseau horaire : <li><pre class='brush:go;toolbar:false;'>location, err := time.LoadLocation(&quot;America/New_York&quot;) if err != nil { // 处理错误 }</pre><p></p> </li> Rechargez périodiquement la position du fuseau horaire en boucle :
for {
 // 等待一段时间(例如每 10 分钟)

 updatedLocation, err := time.LoadLocation("America/New_York")
 if err != nil {
     // 处理错误
 }

 // 比较新旧时区位置
 if updatedLocation != location {
     // 时区已更改
 }
 // 更新时区位置以供以后使用
 location = updatedLocation
}

Utilisez un minuteur

Une autre approche consiste à utiliser une minuterie pour recharger périodiquement l'emplacement du fuseau horaire :

// 创建一个计时器,每隔 10 分钟触发
timer := time.NewTimer(10 * time.Minute)

for {
    select {
    case <-timer.C:
        // 重新加载时区位置
        location, err := time.LoadLocation("America/New_York")
        if err != nil {
            // 处理错误
        }

        // 比较新旧时区位置
        if updatedLocation != location {
            // 时区已更改
        }
        // 更新时区位置以供以后使用
        location = updatedLocation
        // 重置计时器以再次触发
        timer.Reset(10 * time.Minute)
    }
}

Cas pratique

🎜 Considérons un serveur API qui doit afficher des informations en fonction du fuseau horaire de l'utilisateur. Les changements de fuseau horaire peuvent entraîner l’affichage d’informations obsolètes ou incorrectes. En détectant périodiquement les changements de fuseau horaire, le serveur peut mettre à jour son emplacement et garantir son exactitude. 🎜
// API 服务器代码
package main

import (
    "context"
    "fmt"
    "log"
    "net/http"
    "sync"
    "time"

    "github.com/gorilla/mux"
)

var (
    mu    sync.Mutex
    cache map[string]*time.Location
)

func main() {
    cache = make(map[string]*time.Location)

    go loadLocations(context.Background())

    r := mux.NewRouter()
    r.HandleFunc("/{timezone}", getTime).Methods(http.MethodGet)
    log.Fatal(http.ListenAndServe(":8080", r))
}

func getTime(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    timezone := vars["timezone"]

    mu.Lock()
    location, ok := cache[timezone]
    mu.Unlock()

    if !ok {
        w.WriteHeader(http.StatusBadRequest)
        fmt.Fprintf(w, "Invalid timezone: %s", timezone)
        return
    }

    now := time.Now().In(location)
    fmt.Fprintf(w, "Current time in %s: %s", timezone, now.Format("Mon, 02 Jan 2006 15:04 MST"))
}

func loadLocations(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            return
        default:
            mu.Lock()
            for _, location := range time.AvailableLocations() {
                cache[location] = time.LoadLocation(location)
            }
            mu.Unlock()
            time.Sleep(10 * time.Minute)
        }
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn