Domanda

Sto scrivendo un programma che deve inviare un'e-mail ogni ora allo scoccare dell'ora, ma a un orario locale per l'utente.

Supponiamo che io abbia 2 utenti in fusi orari diversi.John è a New York e Fred è a Los Angeles.Il server è a Chicago.Se desidero inviare un'e-mail alle 18:00 locali a ciascun utente, dovrei inviare l'e-mail a John alle 19:00 ora del server e a Fred alle 16:00 ora del server.

Qual è un buon approccio a questo in .NET/Sql Server?Ho trovato un file XML con tutte le informazioni sul fuso orario, quindi sto pensando di scrivere uno script per importarlo nel database e quindi eseguirne una query.

Modificare: Ho utilizzato "t4znet.dll" e ho eseguito tutti i confronti sul lato .NET.

È stato utile?

Soluzione

Hai due opzioni:

  • Memorizza l'orario modificato per l'azione di posta nel database per ciascun utente.Quindi confronta semplicemente l'ora del server con l'ora memorizzata.Per evitare confusione e problemi di portabilità, memorizzerei tutti gli orari in UTC.Quindi, invia la posta quando SERVER_UTC_TIME() == storedUtcTime.
  • Memorizza l'ora locale per ogni azione di posta nel database, quindi convertila al volo.Invia posta quando SERVER_UTC_TIME() == TO_UTC_TIME(storedLocalTime, userTimeZone).

Dovresti decidere cosa ha più senso per la tua applicazione.Ad esempio, se l'orario di invio è sempre lo stesso per tutti gli utenti, è più sensato scegliere l'opzione (2).Se gli orari degli eventi possono cambiare tra utenti e anche per utente, ciò potrebbe rendere più semplice lo sviluppo e il debug se si sceglie l'opzione (1).In ogni caso dovrai conoscere il fuso orario dell'utente.

*Queste chiamate di funzione sono ovviamente pseudo, poiché non conosco le loro invocazioni in T-SQL, ma dovrebbero esistere.

Altri suggerimenti

Sono uno sviluppatore PHP quindi condividerò ciò che so da PHP.Sono sicuro che .NET includerà qualcosa di simile.

In PHP puoi ottenere differenze di fuso orario per l'ora del server: poiché hai suggerito di inviare le e-mail in orari diversi sul server.

Ogni volta che aggiungi un utente, salva la sua differenza temporale rispetto all'ora del server (o il suo fuso orario nel caso in cui il fuso orario del server cambi).

Quindi, quando specifichi un aggiornamento, disponi di un'attività automatizzata (Cron per gli utenti LAMP) che viene eseguita ogni ora per verificare se è necessario inviare un'e-mail.Fallo finché non ci sono più email da inviare.

Puoi completare la tua soluzione con questo eccellente articolo "Orologio mondiale e la classe TimeZoneInformation", ho creato un servizio web che inviava un file con informazioni che includevano l'ora locale e quella del ricevitore, quello che ho fatto è stato modificare questa classe in modo da poter gestire quel problema e ha funzionato perfettamente, esattamente come mi serviva.

Penso che potresti seguire questo corso e ottenere dalla tabella "Utenti" il loro fuso orario e "calcolare" l'orario appropriato, il mio codice è andato così;

//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();

Questa classe ha un problema in Windows Vista che blocca la funzione "FromIndex(int ​​index)" ma puoi modificare il codice, invece di utilizzare la funzione:

    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");
    }

Puoi cambiarlo 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");
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top