consiglierei di sempre uso UTC (GMT) sul lato server (in code-behind, database, ecc), e convertire il tempo da UTC a ora locale per scopi di visualizzazione solo. Ciò significa che tutte le manipolazioni temporali, compreso il risparmio di tempo nel database, l'esecuzione di calcoli, ecc., Dovrebbero essere eseguite utilizzando l'UTC.
Il problema è: come fa il code-behind a sapere qual è il fuso orario del browser client? Supponiamo che l'utente inserisca un determinato valore data/ora (ad esempio 12/30/2009 14:30) nel modulo e lo invii al server. Supponendo che l'utente abbia inviato l'ora locale, come fa il server a sapere come convertire questo valore in UTC?
L'applicazione può chiedere all'utente di specificare il fuso orario (e salvarlo in un cookie o database persistente), ma richiede uno sforzo extra da parte dell'utente e l'app dovrà implementare la logica e gli schermi per questo . Sarebbe più bello se l'app potesse determinare automaticamente il fuso orario del client.
Ho risolto questo problema con l'aiuto della funzione JavaScript getTimezoneOffset, che è l'unica API in grado di comunicare al server la differenza di orario tra ora locale sul client e GMT. Poiché si tratta di un'API lato client, ho eseguito le seguenti operazioni: sul lato server, verificare la presenza di un cookie di sessione personalizzato contenente il valore dell'offset temporale e, se non è disponibile, ricaricare la pagina (solo durante GET e non POST, chiamate) con alcune logiche JavaScript aggiunte per generare l'offset temporale e salvarlo nel cookie. Dal lato client questo è quasi trasparente (una volta durante la sessione ricarico una pagina su GET). Una volta che ho l'offset nel cookie, lo applico alle funzioni di gestione del tempo a seconda della direzione della conversione del tempo (da UTC a ora locale o da ora locale a UTC).
Questo può sembrare un po 'complicato, e lo è, ma dopo che ho scritto funzioni di aiuto, integrando questa funzionalità nel sito era una questione di fare un singola chiamata in Page_Load (di pagine che avevano bisogno di tempo di conversione), e utilizzando le routine di conversione del tempo durante l'invio e il recupero dei valori temporali da e verso il browser. Ecco un esempio di come può essere utilizzato:
using My.Utilities.Web;
...
// Derive the form class from BaseForm instead of Page.
public class WebForm1: BaseForm
{
...
private void Page_Load(object sender, System.EventArgs e)
{
// If we only want to load the page to generate the time
// zone offset cookie, we do not need to do anything else.
if (InitializeLocalTime())
return;
// Assume that txtStartDate is a TextBox control.
if (!IsPostback)
{
// To display a date-time value, convert it from GMT (UTC)
// to local time.
DateTime startDate = GetStartDateFromDB(...);
txtStartDate.Text = FormatLocalDate(startDate);
...
}
else
{
// To save a date-time value, convert it from local
// time to GMT (UTC).
DateTime tempDate = DateTime.Parse(txtStartDate.Text);
DateTime startDate = ConvertLocalTimeToUtc(tempDate);
SaveStartDateInDB(startDate, ...);
...
}
}
...
}
Se avete bisogno di più specifiche, controlla l'articolo It’s About Time: Localizing Time in ASP.NET Applications (mi dispiace, ma non ho un collegamento diretto con l'articolo sul sito dell'editore, dal momento che asp .netPRO limita l'accesso solo agli abbonati pagati, tuttavia ci sono collegamenti alle copie PDF. Vorrei poter postare il campione dell'articolo, ma non voglio violare il copyright; tuttavia, ecco uno project to build a helper library che ha tutte le funzionalità e la documentazione necessarie (ignora solo le cose che non ti servono).
AGGIORNAMENTO: L'articolo è stato pubblicato online con il progetto di esempio del nuovo editore here.
Questa domanda potrebbe essere vecchia e avere una risposta accettata, ma è piuttosto ampia e le risposte riguardano solo un aspetto del problema. La risposta è anche errata, in quanto la soluzione consigliata non copre l'ora legale e utilizza 'TimeZoneInfo' - che non era disponibile in .NET 2.0 (che come requisito di questa domanda). Raccomando che questa domanda sia chiusa o cancellata. –