Ho un sito Web ospitato in un fuso orario diverso rispetto agli utenti che utilizzano l'applicazione. Inoltre, gli utenti possono avere un fuso orario specifico. Mi chiedevo come gli altri utenti e applicazioni SO si avvicinano a questo? La parte più ovvia è che all'interno del DB, data / ora sono memorizzati in UTC. Quando si è sul server, tutte le date / orari devono essere trattati in UTC. Tuttavia, vedo tre problemi che sto cercando di superare:
Ottenere l'ora corrente in UTC (risolto facilmente con
DateTime.UtcNow
).Estrarre data / ora dal database e visualizzarli per l'utente. Esistono potenzialmente molte chiamate per stampare le date su viste diverse. Stavo pensando a un livello tra la vista e i controller che potevano risolvere questo problema. O avere un metodo di estensione personalizzato attivato
DateTime
(vedi sotto). Il lato negativo principale è che in ogni posizione di utilizzo di un datetime in una vista, è necessario chiamare il metodo di estensione!Ciò aggiungerebbe inoltre difficoltà all'uso di qualcosa come
JsonResult
. Non si potrebbe più facilmente chiamareJson(myEnumerable)
, dovrebbe essereJson(myEnumerable.Select(transformAllDates))
. Forse AutoMapper potrebbe aiutare in questa situazione?Ottenere input dall'utente (da locale a UTC). Ad esempio, POSTare un modulo con una data richiederebbe la conversione della data in UTC prima. La prima cosa che viene in mente è la creazione di un'abitudine
ModelBinder
.
Ecco le estensioni che ho pensato di utilizzare nelle viste:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
Penserei che gestire i fusi orari sarebbe una cosa così comune considerando che molte applicazioni sono ora basate su cloud in cui l'ora locale del server potrebbe essere molto diversa dal fuso orario previsto.
Questo è stato elegantemente risolto prima? C'è qualcosa che mi manca? Idee e pensieri sono molto apprezzati.
EDIT: Per chiarire un po 'di confusione, ho pensato di aggiungere qualche dettaglio in più. Il problema in questo momento non è come memorizzare i tempi UTC nel db, è più sul processo di passaggio da UTC-> Local e Local-> UTC. Come sottolinea @Max Zerbini, è ovviamente intelligente mettere in vista il codice UTC-> Local, ma sta usando DateTimeExtensions
davvero la risposta? Quando si riceve l'input dall'utente, ha senso accettare le date come l'ora locale dell'utente (poiché è quello che JS userebbe) e quindi utilizzare a ModelBinder
per trasformarsi in UTC? Il fuso orario dell'utente è memorizzato nel DB ed è facilmente recuperabile.
ModelBinder
.