Tengo un sitio web alojado en una zona horaria diferente a la de los usuarios que usan la aplicación. Además de esto, los usuarios pueden tener una zona horaria específica. Me preguntaba cómo abordan esto otros usuarios y aplicaciones de SO. La parte más obvia es que dentro de la base de datos, la fecha / hora se almacena en UTC. Cuando está en el servidor, todas las fechas / horas deben tratarse en UTC. Sin embargo, veo tres problemas que estoy tratando de superar:
Obtener la hora actual en UTC (resuelto fácilmente con
DateTime.UtcNow
).Extraer fechas / horas de la base de datos y mostrarlas al usuario. Potencialmente, hay muchas llamadas para imprimir fechas en diferentes vistas. Estaba pensando en alguna capa entre la vista y los controladores que podrían resolver este problema. O tener un método de extensión personalizado
DateTime
(ver más abajo). El principal inconveniente es que en cada ubicación de uso de una fecha y hora en una vista, ¡se debe llamar al método de extensión!Esto también agregaría dificultad para usar algo como el
JsonResult
. Ya no podría llamar fácilmenteJson(myEnumerable)
, tendría que ser asíJson(myEnumerable.Select(transformAllDates))
. ¿Quizás AutoMapper podría ayudar en esta situación?Obteniendo información del usuario (Local a UTC). Por ejemplo, PUBLICAR un formulario con una fecha requeriría convertir la fecha a UTC anterior. Lo primero que viene a la mente es crear una costumbre
ModelBinder
.
Aquí están las extensiones que pensé usar en las vistas:
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);
}
}
Creo que tratar con zonas horarias sería algo tan común considerando que muchas aplicaciones ahora están basadas en la nube, donde la hora local del servidor podría ser muy diferente a la zona horaria esperada.
¿Se ha resuelto con elegancia esto antes? ¿Hay algo que me falta? Ideas y pensamientos son muy apreciados.
EDITAR: Para aclarar la confusión, pensé agregar algunos detalles más. El problema en este momento no es cómo almacenar las horas UTC en la base de datos, sino más bien el proceso de pasar de UTC-> Local y Local-> UTC. Como señala @Max Zerbini, obviamente es inteligente poner el código UTC-> Local en la vista, pero ¿está usando DateTimeExtensions
realmente la respuesta? Al recibir información del usuario, ¿tiene sentido aceptar fechas como la hora local del usuario (ya que eso es lo que JS estaría usando) y luego usar a ModelBinder
para transformar a UTC? La zona horaria del usuario se almacena en la base de datos y se recupera fácilmente.
ModelBinder
.