„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > So verwalten Sie Zeitzonen und synchronisieren Ihre Software auf der Serverseite mit Go

So verwalten Sie Zeitzonen und synchronisieren Ihre Software auf der Serverseite mit Go

Veröffentlicht am 03.11.2024
Durchsuche:537

Wenn Ihre Anwendung in großem Umfang gestartet wird, wird die Anzahl der Benutzer zunehmen. Es ist sehr wahrscheinlich, dass sich der Standort des Benutzers nicht nur in derselben Gegend befindet, sondern auch in einer anderen Gegend mit einer anderen Zeitzone. Als Backend-Entwickler ist es daher sehr wichtig, über Dinge im Zusammenhang mit dem Umgang mit Zeitzonenunterschieden nachzudenken.

Ich bin kürzlich auf ein Problem mit Zeitzonen gestoßen. Seien wir ehrlich: Der Umgang mit Datum und Uhrzeit ist einer der kompliziertesten Bereiche, mit denen sich ein Mensch auseinandersetzen muss. Und dies war für mich eine Gelegenheit zu lernen, wie man serverseitig richtig mit Datums- und Uhrzeitangaben umgeht.

In diesem Artikel werde ich meine Erfahrungen darüber teilen, wie ich als Backend-Entwickler mit Zeitzonenunterschieden auf der Serverseite umgehe. Vielleicht wäre es für mich wertvoll, wenn jemand bereit wäre, zu korrigieren und zusätzliche Beiträge zu leisten.

Über die Zeitzone

Zeitzonen sind ein Standard-Zeitteilungssystem, das weltweit zur Organisation und Standardisierung der Zeitmessung verwendet wird. Dieses Konzept entstand als Reaktion auf die Notwendigkeit einer globalen Zeitkoordination, insbesondere zusammen mit Entwicklungen in der Kommunikations- und Transporttechnologie.

Das Grundprinzip der Zeitzonen ist die Einteilung der Erde in 24 Zonen. Jede Zeitzone unterscheidet sich im Allgemeinen um eine Stunde von der Zone daneben. Die Hauptreferenz für Zeitzonen ist die Greenwich Mean Time (GMT) oder die koordinierte Weltzeit (UTC), die auf der Nullgrad-Längenlinie liegt, die durch Greenwich, England, verläuft.

How to Handle Time Zones and Sync Your Software on the server side using Go
Illustration von Hellerick aus Wikimedia Commons

Ein kleines Beispiel ist, wenn die Uhr in Jakarta 12:00 Uhr mittags anzeigt, in New York hingegen 00:00 Uhr oder Mitternacht. Das heißt, während die Jakartaner ihr Mittagessen genießen, beginnen die New Yorker gerade erst ihren neuen Tag. Von hier aus können Sie sich sicherlich vorstellen, wie wichtig es ist, beim Erstellen einer Anwendung korrekt mit Zeitzonen umzugehen.

Zeitzonenbehandlung auf der Serverseite

Nachdem wir die obige Erklärung gesehen haben, gehen wir nun auf die Punkte ein, die durchgeführt werden können, wenn unsere Serveranwendung eine Anfrage von einem Client erhält, der auf unsere API zugreift, um seine Zeitzone zu verwalten.

In diesem Artikel werde ich verschiedene Ansätze zum Umgang mit Zeitzonen auf der Serverseite diskutieren. Hier verwende ich Codebeispiele in der Sprache Golang (Go). Golang verfügt über ein Zeitpaket für die Arbeit mit zeitbezogenen Daten, das als recht vollständig gilt. Hier sind einige Punkte, die wir besprechen werden:

  • So speichern Sie das Datum in der Datenbank
  • Umrechnung der Ortszeit des Benutzers
  • Testen und Validieren

So speichern Sie das Datum in der Datenbank

Das erste, was wir besprechen werden, ist, welche Zeit wir in der Datenbank einsparen werden, zum Beispiel haben wir eine E-Commerce-Anwendung, die Flash-Verkäufe durchführt, wobei unsere Anwendung bereits auf internationaler Ebene läuft.

Wenn ein Benutzer eine Kauftransaktion in Amerika abwickelt oder wenn sich der Benutzer in Indonesien befindet, sendet der Benutzer seine abweichende Ortszeit an den Server. Die Frage ist: Wird unsere Datenbank Zeitdaten entsprechend der Ortszeit des Benutzers speichern? Wenn die Antwort „Ja“ lautet, handelt es sich wahrscheinlich um ein kompliziertes Problem, wenn wir die Daten abrufen möchten oder der Administrator beispielsweise die Datenverarbeitung durchführen möchte, welcher Benutzer die früheste Transaktion durchführt.

Um dies zu umgehen, besteht die beste Vorgehensweise darin, Transaktionszeiten in der Zeitzone UTC (koordinierte Weltzeit) zu speichern, die der primäre Zeitstandard für Uhren und Zeiteinstellungen ist. Hier ist die Anwendung der Zeit auf UTC.

package main

import (
    "fmt"
    "time"
)

func main() {

    now := time.Now()
    fmt.Printf("Local time: %s\n", now)

    nowInUTC := now.UTC()
    fmt.Printf("UTC time: %s\n", nowInUTC)

}

Sehen wir uns die Bedeutung des obigen Codes an.

Zuerst verwendet diese Zeile in der Codezeile now := time.Now() die Funktion Now() aus dem Paket time, um die aktuelle Zeit basierend auf der lokalen Zeitzone des Systems abzurufen. Das Ergebnis wird in der aktuellen Variablen gespeichert.

Dann konvertieren wir hier in der Zeile nowInUTC := now.UTC() die Ortszeit (now) mithilfe der UTC()-Methode in UTC-Zeit. Die Ergebnisse werden in einer neuen Variablen nowInUTC gespeichert und können dieses Mal auf dem Server gespeichert werden, wo Entwickler hoffentlich Unklarheiten und Fehler vermeiden können, die aufgrund von Zeitzonenunterschieden zwischen Servern und Benutzern in verschiedenen Regionen mit unterschiedlichen Zeitzonen entstehen können.

Hier sind die Ergebnisse, wenn wir den obigen Code ausführen:

How to Handle Time Zones and Sync Your Software on the server side using Go

Aber das ist nicht immer die beste Lösung, die Sie verwenden sollten. Möglicherweise gibt es einige Punkte, die Sie in bestimmten Anwendungsfällen beachten sollten. Einer davon ist, dass unsere Benutzer aus unterschiedlichen Zeitzonen kommen. Wenn dies nicht möglich ist, erhöht die Speicherung der Zeit in UTC möglicherweise die Komplexität Ihres Codes.

Ändern Sie die Zeit in das Benutzergebietsschema

Im obigen Diskussionspunkt haben wir vereinbart, Benutzerzeitdaten an einem Ort zu speichern, nämlich UTC. Jetzt können Benutzer die genaue Zeit entsprechend ihrem Standort sehen. Ein Beispiel für die obige Diskussion ist ein Flash-Sale in einer E-Commerce-Anwendung, die wir haben, bei der Benutzer auch Informationen darüber wissen möchten, welcher Benutzer die erste Transaktion durchgeführt hat. An dieser Stelle ist die Konvertierung der in der Datenbank gespeicherten Zeit in die Ortszeit des Benutzers ein weiterer wichtiger Punkt, den wir nicht ignorieren sollten.

Der Ansatz, den ich verfolge, besteht darin, dass die Serverseite den Client immer auffordert, die Zeitzone an die Benutzerseite zu senden. Dies kann auf der Anforderungsseite erfolgen, indem der Client einen Header mit der Schlüsselzeitzone sendet und über den Zeitzonenwert des Benutzers verfügt. Indonesien hat beispielsweise drei Zeitzoneneinteilungen, nämlich WIT( 9), WITA( 8) und WIB( 7). Wobei jede Zone einen Unterschied von 1 Stunde hat. Wenn wir zuvor auf unserem Server die UTC-Zeit um 00.00 Uhr gespeichert haben, war sie auf der WIT-Seite um 09.00 Uhr, auf der WITA-Seite um 08.00 Uhr und WIB um 07.00 Uhr.

Hier ist ein Beispielcode zur Behandlung des obigen Falls:

package main

import (
    "fmt"
    "time"
)

func ParseTimezoneFromString(tz string) *time.Location {

    if len(tz) > 0 {

        t, err := time.Parse("2006 -07:00", fmt.Sprintf("2007 %s", tz))

        if err != nil {

            panic(err)

        } else {

            return t.Location()
        }
    }

    return time.Now().Location()
}

func main() {

    timeServerInUTC := "2024-08-04 00:00:00"
    nowInUTC, err := time.Parse("2006-01-02 15:04:05", timeServerInUTC)
    if err != nil {
        panic(err)
    }

    fmt.Printf("UTC time: %s\n", nowInUTC)

    witLocation := ParseTimezoneFromString(" 09:00")

    nowInWIT := nowInUTC.In(witLocation)
    fmt.Printf("WIT time: %s\n", nowInWIT)

    witaLocation := ParseTimezoneFromString(" 08:00")

    nowInWITA := nowInUTC.In(witaLocation)
    fmt.Printf("WITA time: %s\n", nowInWITA)

    wibLocation := ParseTimezoneFromString(" 07:00")

    nowInWIB := nowInUTC.In(wibLocation)
    fmt.Printf("WIB time: %s\n", nowInWIB)

}

Gutschrift an dikac für die Erstellung dieser Funktion ParseTimezoneFromString

Lassen Sie uns die Bedeutung des obigen Codes verstehen:

Zuerst erstellen wir eine Funktion ParseTimezoneFromString, wobei diese Funktion verwendet wird, um den Zeitort basierend auf dem Argument tz oder der Zeitzone des angegebenen Benutzerstandorts zu finden. Wenn der Zeichenfolgenwert tz gültig ist, konvertieren wir die Zeitzone der Zeichenfolge mithilfe der Funktion time.Parse, um die Zeichenfolge in ein Zeitobjekt zu konvertieren, und extrahieren dann den Standort (Zeitzone) aus diesem Objekt. Und wenn die Zeichenfolge leer ist oder das Parsen fehlschlägt, geben wir auch die lokale Zeitzone des Systems zurück.

func ParseTimezoneFromString(tz string) *time.Location {

    if len(tz) > 0 {

        t, err := time.Parse("2006 -07:00", fmt.Sprintf("2007 %s", tz))

        if err != nil {

            panic(err)

        } else {

            return t.Location()
        }
    }

    return time.Now().Location()
}

Als nächstes definieren wir auch Zeitdaten im folgenden String-Format:

timeServerInUTC := "2024-08-04 00:00:00"

nowInUTC, err := time.Parse("2006-01-02 15:04:05", timeServerInUTC)
if err != nil {
    panic(err)
}

Sie können sich dies als die Zeitdaten vorstellen, die wir vom Server erhalten. Und analysieren Sie es in ein Zeitobjekt.

Als nächstes versuchen wir, den genauen Standort des Benutzers basierend auf der ParseTimezoneFromString-Funktion zu ermitteln, die wir zuvor basierend auf dem von uns definierten String-Argument erstellt haben. Zu beachten ist, dass es sich bei diesem String-Argument um den Wert des Zeitzonen-Headers handelt, der vom Client über die eingehende Anfrage gesendet wird.

Wir können den Standort, den wir von der ParseTimezoneFromString-Funktion erhalten, verwenden, um die Zeit, die wir vom Server erhalten, in die Ortszeit des Benutzers umzuwandeln oder zu verschieben. Wir können dies mit der In-Funktion tun, die auch im Zeitpaket enthalten ist, was wir im folgenden Codeausschnitt sehen können:

nowInWIT := nowInUTC.In(witLocation)
nowInWITA := nowInUTC.In(witaLocation)
nowInWIB := nowInUTC.In(wibLocation)

Wenn wir es ausführen, erhalten wir die Zeit, die dem von uns definierten Zeitzonenstandort entspricht.

How to Handle Time Zones and Sync Your Software on the server side using Go

Testen und Validieren

Der letzte Punkt ist nicht weniger wichtig, nämlich Testen und Validieren. Wenn der Entwicklungsprozess häufig dazu führt, dass Entwickler unerwartete Fehler machen, sind Tests und Validierung immer wichtig.

In der Diskussion von Punkt 2 oben war die ParseTimezoneFromString-Funktion wichtig für den Umgang mit unseren Zeitzonen. Wiederholte Tests und Validierungen sind wichtig, damit unsere Anwendungen Ergebnisse liefern, die unseren Erwartungen entsprechen.

Zum Testen wird empfohlen, Unit-Tests zu verwenden, bei denen der Test auf der kleinsten Einheit durchgeführt wird und mehrere Szenarien hinzugefügt werden können. Je mehr Szenarien es gibt, desto unwahrscheinlicher ist es, diese Zeitunterschiede zu bewältigen.

Abschluss

Der Umgang mit Zeitzonen kann für Backend-Entwickler tatsächlich schwierig sein. Es ist jedoch wichtig, sich daran zu erinnern, dass jede anspruchsvolle Aufgabe, die wir meistern, zu unserem Wachstum und der Verbesserung unserer Fähigkeiten beiträgt. Die ordnungsgemäße Verwaltung von Zeitzonen ist nicht nur eine technische Notwendigkeit, sie gewährleistet auch eine genaue Planung und sorgt für ein reibungsloses Erlebnis für unsere Anwendungsbenutzer in verschiedenen Regionen.

Die in diesem Artikel geteilten Punkte zum Speichern von Zeiten in UTC, zur Konvertierung in Benutzer-Ortszeiten und zur Implementierung robuster Konvertierungsfunktionen sind Ausgangspunkte für die Bewältigung dieses komplexen Problems. Ich erkenne jedoch an, dass es bei den besprochenen Ansätzen möglicherweise Mängel oder Verbesserungsmöglichkeiten gibt. Aus diesem Grund sind zusätzliche Beiträge und Vorschläge aus der Entwickler-Community von unschätzbarem Wert.

Ich hoffe aufrichtig, dass die in diesem Artikel bereitgestellten Erkenntnisse und Codebeispiele Ihnen in Zukunft hilfreich sein werden, wenn Sie in Ihren Projekten auf Herausforderungen im Zusammenhang mit der Zeitzone stoßen. Denken Sie daran, dass das Ziel darin besteht, Anwendungen zu erstellen, die für Benutzer unabhängig von ihrem geografischen Standort reibungslos funktionieren.

Lassen Sie uns diese Diskussion im Kommentarbereich unten fortsetzen. Ich würde gerne von Ihren Erfahrungen mit dem Umgang mit Zeitzonen, den Herausforderungen, mit denen Sie konfrontiert waren, oder alternativen Ansätzen hören, die Sie für wirksam befunden haben. Ihre Erkenntnisse könnten für mich und andere Leser, die mit ähnlichen Problemen konfrontiert sind, äußerst wertvoll sein.

Vielen Dank fürs Lesen und ich hoffe, dass sich dieser Artikel auf Ihrer Entwicklungsreise als nützlich erweist. Lasst uns gemeinsam weiter lernen und uns verbessern! ?

Referenzen lesen

  • Zeitzone
  • Was ist eine Zeitzone?
  • So gehen Sie mit Zeitzonen um und synchronisieren Ihre Software mit internationalen Kunden
  • Umgang mit Zeitzonen in der Webentwicklung
  • Arbeiten mit Datums- und Uhrzeitangaben in Go: Umgang mit Zeitzonen und Formatierung
Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/tentanganak/how-to-handle-time-zones-and-sync-your-software-on-the-server-side-using-go-16ip?1Falls vorhanden Im Falle eines Verstoßes wenden Sie sich zum Löschen bitte an [email protected]
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3