net mvc asp asp.net timezone

asp.net - asp - render partial javascript mvc



¿Puedo obtener la zona horaria del navegador en ASP.NET o tengo que confiar en las operaciones de JS para recuperar la información? (4)

¿Puedo obtener la zona horaria del navegador en ASP.NET o debo depender de las operaciones de JS para recuperar la información?


Necesitas confiar en javascript. Aquí hay una biblioteca para hacer eso - detect_timezone.js


No hay un encabezado de "Aceptar-Zona horaria" (o similar); el estándar HTTP no contiene ninguna facilidad para permitir que el navegador le diga automáticamente al servidor qué zona horaria le interesa al usuario.

El enfoque básico es usar una fecha y leer la información de TZ.

Dado que no hay ningún estándar (funciones de nombre de zona horaria en todos los navegadores, debe recurrir a algo como (¡sí!):

function getTimezoneName() { tmSummer = new Date(Date.UTC(2005, 6, 30, 0, 0, 0, 0)); so = -1 * tmSummer.getTimezoneOffset(); tmWinter = new Date(Date.UTC(2005, 12, 30, 0, 0, 0, 0)); wo = -1 * tmWinter.getTimezoneOffset(); if (-660 == so && -660 == wo) return ''Pacific/Midway''; if (-600 == so && -600 == wo) return ''Pacific/Tahiti''; if (-570 == so && -570 == wo) return ''Pacific/Marquesas''; if (-540 == so && -600 == wo) return ''America/Adak''; if (-540 == so && -540 == wo) return ''Pacific/Gambier''; if (-480 == so && -540 == wo) return ''US/Alaska''; if (-480 == so && -480 == wo) return ''Pacific/Pitcairn''; if (-420 == so && -480 == wo) return ''US/Pacific''; if (-420 == so && -420 == wo) return ''US/Arizona''; if (-360 == so && -420 == wo) return ''US/Mountain''; if (-360 == so && -360 == wo) return ''America/Guatemala''; if (-360 == so && -300 == wo) return ''Pacific/Easter''; if (-300 == so && -360 == wo) return ''US/Central''; if (-300 == so && -300 == wo) return ''America/Bogota''; if (-240 == so && -300 == wo) return ''US/Eastern''; if (-240 == so && -240 == wo) return ''America/Caracas''; if (-240 == so && -180 == wo) return ''America/Santiago''; if (-180 == so && -240 == wo) return ''Canada/Atlantic''; if (-180 == so && -180 == wo) return ''America/Montevideo''; if (-180 == so && -120 == wo) return ''America/Sao_Paulo''; if (-150 == so && -210 == wo) return ''America/St_Johns''; if (-120 == so && -180 == wo) return ''America/Godthab''; if (-120 == so && -120 == wo) return ''America/Noronha''; if (-60 == so && -60 == wo) return ''Atlantic/Cape_Verde''; if (0 == so && -60 == wo) return ''Atlantic/Azores''; if (0 == so && 0 == wo) return ''Africa/Casablanca''; if (60 == so && 0 == wo) return ''Europe/London''; if (60 == so && 60 == wo) return ''Africa/Algiers''; if (60 == so && 120 == wo) return ''Africa/Windhoek''; if (120 == so && 60 == wo) return ''Europe/Amsterdam''; if (120 == so && 120 == wo) return ''Africa/Harare''; if (180 == so && 120 == wo) return ''Europe/Athens''; if (180 == so && 180 == wo) return ''Africa/Nairobi''; if (240 == so && 180 == wo) return ''Europe/Moscow''; if (240 == so && 240 == wo) return ''Asia/Dubai''; if (270 == so && 210 == wo) return ''Asia/Tehran''; if (270 == so && 270 == wo) return ''Asia/Kabul''; if (300 == so && 240 == wo) return ''Asia/Baku''; if (300 == so && 300 == wo) return ''Asia/Karachi''; if (330 == so && 330 == wo) return ''Asia/Calcutta''; if (345 == so && 345 == wo) return ''Asia/Katmandu''; if (360 == so && 300 == wo) return ''Asia/Yekaterinburg''; if (360 == so && 360 == wo) return ''Asia/Colombo''; if (390 == so && 390 == wo) return ''Asia/Rangoon''; if (420 == so && 360 == wo) return ''Asia/Almaty''; if (420 == so && 420 == wo) return ''Asia/Bangkok''; if (480 == so && 420 == wo) return ''Asia/Krasnoyarsk''; if (480 == so && 480 == wo) return ''Australia/Perth''; if (540 == so && 480 == wo) return ''Asia/Irkutsk''; if (540 == so && 540 == wo) return ''Asia/Tokyo''; if (570 == so && 570 == wo) return ''Australia/Darwin''; if (570 == so && 630 == wo) return ''Australia/Adelaide''; if (600 == so && 540 == wo) return ''Asia/Yakutsk''; if (600 == so && 600 == wo) return ''Australia/Brisbane''; if (600 == so && 660 == wo) return ''Australia/Sydney''; if (630 == so && 660 == wo) return ''Australia/Lord_Howe''; if (660 == so && 600 == wo) return ''Asia/Vladivostok''; if (660 == so && 660 == wo) return ''Pacific/Guadalcanal''; if (690 == so && 690 == wo) return ''Pacific/Norfolk''; if (720 == so && 660 == wo) return ''Asia/Magadan''; if (720 == so && 720 == wo) return ''Pacific/Fiji''; if (720 == so && 780 == wo) return ''Pacific/Auckland''; if (765 == so && 825 == wo) return ''Pacific/Chatham''; if (780 == so && 780 == wo) return ''Pacific/Enderbury'' if (840 == so && 840 == wo) return ''Pacific/Kiritimati''; return ''US/Pacific''; }


No puede obtener de forma confiable la configuración de la zona horaria del cliente desde el navegador en el lado del cliente o del servidor.

Puede, desde JavaScript, obtener el desplazamiento de la zona horaria actual de UTC, utilizando Date#getTimezoneOffset . Sin embargo, esto no identifica de manera única una zona horaria, ya que hay muchas zonas que pueden usar el mismo desplazamiento UTC, además de muchas regiones que cambian las zonas horarias en DST.

A veces, puede obtener una cadena que representa el nombre corto de la zona horaria llamando a Date#toLocaleString . No hay garantía de que haya un nombre de zona horaria utilizable, y los nombres de zona horaria no son exclusivos a nivel mundial, y en ocasiones el navegador se encuentra (especialmente sobre DST). Pero a menudo hay algo , y si puede vincular esa abreviatura con el desplazamiento que ya ha leído, y compararlo con una lista de reglas conocidas de la zona horaria, le dará una buena primera idea. También puede utilizar la orientación geográfica de IP y el uso del lado del servidor del encabezado Accept-Language para ayudar a adivinar mejor.

Si es importante que los usuarios vean los horarios locales apropiados, deberá proporcionarles un mecanismo manual para elegir una configuración regional de reglas de zona horaria (por ejemplo, como una configuración por cuenta), porque nada de esto es confiable.


No puede recuperar la zona horaria sin que se ejecute algo en el cliente (es decir, JavaScript) ya que ASP.NET está del lado del servidor.