¿Puedes determinar la zona horaria a partir de las variables de solicitud?

¿Hay alguna manera de hacer las compensaciones de la zona horaria en el lado del servidor, leyendo algo en la solicitud a través de http, en lugar de enviar todo al cliente y dejar que se ocupe de ello?

Esto es más complicado, pero he tenido que recurrir a este escenario antes porque las configuraciones del perfil de la máquina y el usuario a veces no coinciden con las preferencias de los visitantes. Por ejemplo, un visitante del Reino Unido que acceda temporalmente a su sitio desde un servidor australiano.

  1. Utilice un servicio de geolocalización (por ejemplo, MaxMind.com) como lo sugiere @balabaster, para obtener la zona que coincida con su IP (Global.Session_Start es el mejor). Esta es una buena combinación para los ISP locales, pero no tan buena para AOL. Almacene el desplazamiento de esto en una cookie de sesión.

  2. O use JavaScript para obtener el desplazamiento de la zona horaria como parte de un envío / redirección de formulario cuando el usuario ingresa al sitio. Esta es la compensación actual del navegador, pero no necesariamente la zona preferida del visitante. Use este valor como predeterminado almacenar en otra cookie de sesión.

     
  3. Permita que el visitante actualice la zona a través de una cookie persistente (para usuarios anónimos) y un campo en su perfil de cuenta (si está autenticado).

El valor persistente # 3 reemplaza los valores de la sesión. También puede almacenar la misma cookie persistente para los usuarios autenticados para mostrar los tiempos antes de iniciar sesión.

Comprueba detect_timezone.js – hace un buen trabajo determinando la zona horaria del usuario

En cualquiera de los eventos anteriores a la descarga de la página … Request.ServerVariables. Si desea su zona horaria física, verifique su dirección IP y utilice una herramienta de conversión de IP a Geo-Ubicación.

No estoy seguro de si hay otra forma de hacerlo, por lo que si necesita la zona horaria para la que está configurada su computadora, debería esperar a que la página cargue un javascript …

¿Hay alguna manera de hacer las compensaciones de la zona horaria en el lado del servidor, leyendo algo en la solicitud a través de http, en lugar de enviar todo al cliente y dejar que se ocupe de ello?

Esta es la solución que se me ocurrió, cuando tuve el mismo problema con los servicios web de WCF:

Cómo obtener un servicio web WCF para devolver DateTimes en la zona horaria local del usuario

Básicamente, obtengo mi código JavaScript / Angular para determinar la zona horaria del usuario, luego paso este valor a uno de mis servicios web de WCF.

Observe cómo tengo un servicio web llamado getListOfRecords que toma un parámetro, el valor de desplazamiento de la zona horaria.

 $scope.loadSomeDatabaseRecords = function () { var d = new Date() var timezoneOffset = d.getTimezoneOffset(); return $http({ url: 'http://localhost:15021/Service1.svc/getListOfRecords/' + timezoneOffset, method: 'GET', async: true, cache: false, headers: { 'Accept': 'application/json', 'Pragma': 'no-cache' } }).success(function (data) { $scope.listScheduleLog = data.Results; }); } 

A partir de ahí, mi código C # se lee en los registros de la base de datos, aplica esa compensación de zona horaria a los valores UTC DateTime y la devuelve al cliente.

Podemos obtener la zona horaria utilizando el código siguiente en el lado del servidor en lugar de enviar el valor del cliente.

 private TimeZoneInfo GetRequestTimeZone() { TimeZoneInfo timeZoneInfo = null; DateTimeOffset localDateOffset; try { localDateOffset = new DateTimeOffset(Request.RequestContext.HttpContext.Timestamp, Request.RequestContext.HttpContext.Timestamp - Request.RequestContext.HttpContext.Timestamp.ToUniversalTime()); timeZoneInfo = (from x in TimeZoneInfo.GetSystemTimeZones() where x.BaseUtcOffset == localDateOffset.Offset select x).FirstOrDefault(); } catch (Exception) { } return timeZoneInfo; } 

Gracias…