Подтвердить что ты не робот

Могу ли я получить часовой пояс браузера в ASP.NET или мне нужно полагаться на операции JS для извлечения информации?

Могу ли я получить часовой пояс браузера в ASP.NET или мне нужно полагаться на операции JS для получения информации.

4b9b3361

Ответ 1

Нет заголовка "Accept-Timezone" (или т.п.) - стандарт HTTP не содержит каких-либо возможностей, позволяющих браузеру автоматически сообщать серверу о том, в какой часовой зоне пользователь обращается.

Основной подход - использовать дату и прочитать информацию TZ от нее.

Так как нет стандартных (функции именования в часовых поясах в кросс-браузере), вам нужно прибегнуть к чему-то вроде (yikes!):

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';
}

Ответ 2

Вам нужно полагаться на javascript. Вот библиотека для этого - detect_timezone.js

Ответ 3

Вы не можете надежно получить настройки часового пояса клиента из браузера на стороне клиента или сервера.

Вы можете с помощью JavaScript получить смещение текущего часового пояса с UTC, используя Date#getTimezoneOffset. Это не однозначно идентифицирует часовой пояс, хотя, поскольку существует много зон, которые могут использовать одно и то же UTC-смещение, а также множество регионов, которые переключают тайм-точки на DST.

Иногда вы можете получить строку, представляющую короткое имя часового пояса, вызывая Date#toLocaleString. Там нет гарантии, что будет имя используемого часового пояса, а имена часовых поясов не являются глобально уникальными, а иногда и браузером (особенно о DST). Но часто есть что-то, и если вы можете связать эту аббревиатуру со смещением, которое вы уже прочитали, и сравнить это с кратким списком известных правил часового пояса, это дает вам хорошее предположение. Вы также можете использовать географический IP-таргетинг и использовать серверный заголовок Accept-Language на стороне сервера, чтобы помочь лучше понять.

Если важно, чтобы пользователи увидели соответствующие локальные времена, вам необходимо предоставить им ручной механизм для выбора языкового стандарта правил часового пояса (например, для настройки для каждой учетной записи), потому что это не является надежным.

Ответ 4

Вы не можете получить часовой пояс без запуска на клиенте (например, JavaScript), поскольку ASP.NET является серверной.