Frage

Ich schreibe ein Programm, das zu jeder vollen Stunde eine E-Mail versenden muss, jedoch zu einem lokalen Zeitpunkt für den Benutzer.

Angenommen, ich habe zwei Benutzer in verschiedenen Zeitzonen.John ist in New York und Fred ist in Los Angeles.Der Server steht in Chicago.Wenn ich jedem Benutzer um 18:00 Uhr lokal eine E-Mail senden möchte, muss ich die E-Mail um 19:00 Uhr Serverzeit an John und um 16:00 Uhr Serverzeit an Fred senden.

Was ist ein guter Ansatz hierfür in .NET/SQL Server?Ich habe eine XML-Datei mit allen Zeitzoneninformationen gefunden und überlege daher, ein Skript zu schreiben, um sie in die Datenbank zu importieren und sie dann abzufragen.

Bearbeiten: Ich habe „t4znet.dll“ verwendet und alle Vergleiche auf der .NET-Seite durchgeführt.

War es hilfreich?

Lösung

Sie haben zwei Möglichkeiten:

  • Speichern Sie für jeden Benutzer die angepasste Zeit für die Mail-Aktion in der Datenbank.Dann vergleichen Sie einfach die Serverzeit mit der gespeicherten Zeit.Um Verwirrung und Portabilitätsprobleme zu vermeiden, würde ich alle Zeiten in UTC speichern.Senden Sie also eine E-Mail, wenn SERVER_UTC_TIME() == gespeichertUtcTime ist.
  • Speichern Sie die Ortszeit für jede E-Mail-Aktion in der Datenbank und konvertieren Sie sie dann spontan.E-Mail senden, wenn SERVER_UTC_TIME() == TO_UTC_TIME(storedLocalTime, userTimeZone).

Sie sollten entscheiden, was für Ihre Bewerbung am sinnvollsten ist.Wenn beispielsweise die Versandzeit für alle Benutzer immer gleich ist, ist es sinnvoller, Option (2) zu wählen.Wenn sich die Ereigniszeiten zwischen Benutzern und sogar pro Benutzer ändern können, kann es die Entwicklung und das Debuggen erleichtern, wenn Sie Option (1) wählen.In jedem Fall müssen Sie die Zeitzone des Benutzers kennen.

*Diese Funktionsaufrufe sind offensichtlich pseudo, da ich ihre Aufrufe in T-SQL nicht kenne, aber sie sollten existieren.

Andere Tipps

Ich bin PHP-Entwickler und teile daher mit Ihnen, was ich über PHP weiß.Ich bin sicher, dass .NET etwas Ähnliches enthalten wird.

In PHP können Sie Zeitzonenunterschiede für die Serverzeit abrufen – da Sie vorgeschlagen haben, dass Sie die E-Mails zu unterschiedlichen Zeiten auf dem Server senden würden.

Jedes Mal, wenn Sie einen Benutzer hinzufügen, speichern Sie dessen Zeitversatz zur Serverzeit (oder seine Zeitzone, falls sich die Serverzeitzone ändert).

Wenn Sie dann ein Update angeben, führen Sie eine automatisierte Aufgabe (Cron für LAMP-Benutzer) durch, die jede Stunde prüft, ob eine E-Mail gesendet werden muss.Tun Sie dies, bis keine E-Mails mehr zum Versenden übrig sind.

Sie können Ihre Lösung mit diesem hervorragenden Artikel ergänzen.Weltzeituhr und die TimeZoneInformation-Klasse„Ich habe einen Webservice erstellt, der eine Datei mit Informationen sendete, die die Ortszeit und die Empfängerzeit enthielten. Ich habe diese Klasse geändert, damit ich dieses Problem lösen konnte, und es funktionierte perfekt, genau so, wie ich es brauchte.

Ich denke, Sie könnten diesen Kurs belegen und aus der Tabelle „Benutzer“ deren Zeitzone abrufen und die entsprechende Zeit „berechnen“. Mein Code ging so aus;

//Get correct destination time
DateTime thedate = DateTime.Now;

string destinationtimezone = null;

//Load the time zone where the file is going
TimeZoneInformation tzi = TimeZoneInformation.FromName(this.m_destinationtimezone);

//Calculate
destinationtimezone = tzi.FromUniversalTime(thedate.ToUniversalTime()).ToString();

Diese Klasse weist in Windows Vista ein Problem auf, das zum Absturz der Funktion „FromIndex(int ​​index)“ führt. Sie können jedoch den Code ändern, anstatt die Funktion zu verwenden:

    public static TimeZoneInformation FromIndex(int index)
    {
        TimeZoneInformation[] zones = EnumZones();

        for (int i = 0; i < zones.Length; ++i)
        {
            if (zones[i].Index == index)
                return zones[i];
        }

        throw new ArgumentOutOfRangeException("index", index, "Unknown time zone index");
    }

Sie können es ändern in:

    public static TimeZoneInformation FromName(string name)
    {
        TimeZoneInformation[] zones = EnumZones();

        foreach (TimeZoneInformation tzi in zones)
        {
            if (tzi.DisplayName.Equals(name))
                return tzi;
        }

        throw new ArgumentOutOfRangeException("name", name, "Unknown time zone name");
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top