horaria - hora actual c#
Problema de zona horaria de la aplicaciĆ³n web (7)
A la hora local siempre en el lado del servidor convertir a la ubicación física. Tienes pocas opciones.
- Almacene el valor de compensación de UTC a los Usuarios, mantenga los tiempos en UTC
- Hacer el lado del cliente de conversión a través de JS (No es elegante, ni apropiado, en mi opinión)
- Mire algunas recomendaciones de MSDN y el espacio de nombres de la zona horaria
Tenemos una aplicación web ASP.Net 2.0 en funcionamiento con el servidor en el Medio Oeste (Eastern Standard Time). En este momento, todos nuestros clientes se encuentran en el mismo huso horario que el servidor. Estamos trayendo otro servidor en línea en Arizona (Mountain Standard Time).
Estamos almacenando todos nuestros tiempos en una base de datos SQL 2005 a través del código C # detrás de DateTime.UtcNow.
Durante las pruebas, encontramos algunos problemas de conversión de zonas horarias. Nuestro problema es que en el navegador web nuestros horarios muestran la hora estándar de la montaña en lugar de la zona horaria que estamos evaluando desde la hora estándar del este.
Cuando ingresamos información nueva, se almacena como UTC en la base de datos, pero cuando vamos a ver esa información en el navegador, se muestra la hora estándar de la montaña. A continuación se muestra el código que toma el valor UTC de la base de datos y lo muestra en el navegador.
lblUpdatedDate.Text = Convert.ToDateTime(dr["UpdatedDate"]).ToLocalTime().ToString();
El código anterior devuelve Mountain Standard Time donde está el servidor, no Eastern Standard Time desde donde se ejecuta el navegador. ¿Cómo obtenemos el tiempo para mostrar dónde está el usuario?
Encontré algo como esto antes de usar ASP.NET. Aquí estaba mi metodología general.
Envié JavaScript para hacer un document.write. El JavaScript determina el desplazamiento del cliente desde GMT. De modo que puede enviar un momento determinado y luego dejar que JavaScript haga un más / menos en él.
Nos encontramos con el mismo o similar problema con los clientes remotos que llaman a nuestra base de datos a través de servicios web donde la base de datos y los clientes se encuentran en diferentes zonas horarias.
Encontramos que es más fácil ordenar al conjunto de datos que no se preocupen por las zonas horarias, por lo que los tiempos no se cambian en las fronteras de la zona horaria ...
Creamos un método de utilidad (SetAllDateModes) que convierte todos los campos de fecha y hora en el conjunto de datos por tabla: aquí está el extremo del negocio (Foreach) y la llamada que establece el modo de fecha:
foreach (DataColumn dc in dt.Columns)
{
if (dc.DataType == typeof(DateTime))
{
dc.DateTimeMode = dateMode;
}
}
SetAllDateModes(dt, DataSetDateTime.Unspecified);
DateSetDateTime.Unspecified no incluye un desplazamiento, por lo que no hay conversión.
Pensé que la idea general era no localizar la fecha y la hora hasta que lo presente el usuario. Entonces, a menos que un humano lo lea, permanece en UTC, GMT, CUT. Una nota adicional utiliza la biblioteca de fecha / hora para que no tenga que preocuparse demasiado por los problemas de cambio de horario de verano.
Si usa .NET 3.5 y conoce la zona horaria en la que se encuentra el usuario, TimeZoneInfo es su amigo. Si no está usando .NET 3.5, hay algunas muestras de P / Invoke para obtener instancias de TimeZone , pero vale la pena evitar eso si tiene acceso a 3.5. (TimeZoneInfo tiene datos históricos, etc., y generalmente es la mejor forma de hacerlo).
Ahora, averiguar qué zona horaria tienen sus usuarios es un problema diferente: la forma más sencilla de evitar confusiones es ofrecerles opciones. (Obtener el desplazamiento "ahora" solo le brinda información limitada).
Tuve el mismo problema. Vendimos nuestra aplicación a un usuario que estaba en una zona horaria diferente a la del servidor web. No almacenamos información de tiempo en UTC, pero en realidad funcionaba correctamente. El tiempo que se muestra en la zona horaria del servidor se muestra exactamente 3 horas atrás. Todo lo que teníamos que hacer era agregar un menú desplegable de zona horaria para que pudieran seleccionar su zona horaria para todo el sitio (ya que los únicos usuarios de la aplicación estarían en su zona horaria). Guardamos esta configuración y luego insertamos una función para tomar todas las visualizaciones de fecha y hora y convertirlas de una zona horaria a otra utilizando el espacio de nombres TimeZoneInfo. Funciona perfectamente
Simplemente siempre almacene la fecha y hora como formato GMT.
Hay 2 pasos:
Detecta diferentes zonas horarias en el lado del cliente usando Javascript:
var dt = new Date();
var diffInMinutes = -dt.getTimezoneOffset();
Luego, en el lado del servidor, código C # para convertir la hora del servidor a la hora del cliente en función del desplazamiento de la zona horaria detectada anteriormente:
string queryStr = Request.QueryString["diffInMinutes"];
int diffInMinutes = 0;
if (Int32.TryParse(queryStr, out diffInMinutes))
{
clientTime = serverTime.ToUniversalTime().AddMinutes(diffInMinutes);
}