Время смещения для DST в одном конкретном часовом поясе с использованием JavaScript

Мне нужно компенсировать время на час, если это сейчас DST в Тихоокеанском часовом поясе. Как определить текущий статус летнего времени Тихоокеанского часового пояса, независимо от пользовательского локального часового пояса?

Вот что я до сих пор. "dst" в строке 4 - это просто заполнитель для функции, которая скажет мне, активна ли летняя экономия в этой зоне.

function checkTime() {  
    var d = new Date();  
    var hour = d.getUTCHours();  
    var offset = dst ? 7 : 8; // is pacific time currently in daylight savings?

    // is it currently 6 AM, 2 PM, or 10 PM?
    if (hour === ((6 + offset) % 24) || hour === ((14 + offset) % 24) || hour === ((22 + offset) % 24)) {  
      // do stuff
    }
}

checkTime();

Ответы

Ответ 1

Единственный реальный способ, которым вы сможете точно сказать, - это получить информацию о DST (включая любые обновления), доступную на сервере, который вы можете задать. Пользовательскому ПК не требуется даже устанавливать информацию о часовом поясе.

Затем вам понадобится "динамический" script, чтобы получить статус DST.

Возможные методы: Ссылка на страницу PHP/ASPX/JSP/CFM/ASP, которая генерирует javascript для установки переменной, которая указывает, активен ли DST или нет, или текущее количество смещений минут.

Напишите script на вашей (надеюсь, динамической) странице напрямую.

Используйте AJAX/REST/JSON для доступа к службе Date/Time где-нибудь, которая может сообщить вам статус DST или количество минут, смещенных от UTC для часового пояса/местоположения.

Минуты предпочтительнее часов, потому что смещения DST на самом деле находятся в минутах во всем мире, а не в часах.

Ответ 2

Я также боролся с этим раньше на PHP-сайте, который должен отображать "мировые часы". В JS нет хорошего способа добиться этого, и даже тогда вы сильно зависите от клиентской среды. Вам действительно нужно выполнить эту задачу на используемом вами языке на стороне сервера.

Если это так, что вы используете PHP, то вы можете найти этот сниппт полезным:

function get_offset_with_DST($timezone_name) {
    $default_timezone = date_default_timezone_get();
    date_default_timezone_set($timezone_name);
    $offset_with_DST = date('Z') / 3600;
    date_default_timezone_set($default_timezone);
    return $offset_with_DST;
}

а затем в JS:

<script>var offsetWithDST = <?= get_offset_with_DST('US/Pacific'); ?>;</script>

Список всех поддерживаемых имен часовых поясов в PHP, проверьте эту страницу.

Ответ 3

В США DST в настоящее время рассчитывается как время, падающее между 2-м воскресенью марта и 1-м воскресенью ноября.

Чтобы рассчитать дату начала летнего времени, мы сначала вычисляем текущий год, затем в тот день, когда наступает первый день марта, и на основании этого мы можем рассчитать второе воскресенье. То же самое делается и в ноябре, и, наконец, проверка того, находится ли сегодня дата между двумя датами привязки. Если true, dst поворачивается на "1".

Для моих потребностей точность дневного уровня является достаточной, но она может быть построена с большей точностью.

    var dst = 0
    var d = new Date();
    var myYear = parseInt(d.getFullYear())
    d.setFullYear(myYear , 2, 1);
    var what_Weekday_Mar1 = d.getDay();

    var DST_StartDay

    switch(what_Weekday_Mar1) {
        case 0:
            DST_StartDay = 14
            break;
        case 1:
            DST_StartDay = 13
            break;
        case 2:
            DST_StartDay = 12
            break;
        case 3:
            DST_StartDay = 11
            break;
        case 4:
            DST_StartDay = 10
            break;
        case 5:
            DST_StartDay = 9
            break;
        case 6:
            DST_StartDay = 8
            break;
     }

    var DST_on_Date = new Date()
    DST_on_Date = DST_on_Date.setFullYear(myYear,2,DST_StartDay)

    d.setFullYear(myYear , 10, 1);
    var what_Weekday_Nov1 = d.getDay();

    switch(what_Weekday_Nov1) {
        case 0:
            DST_EndDay = 1
            break;
        case 1:
            DST_EndDay = 7
            break;
        case 2:
            DST_EndDay = 6
            break;
        case 3:
            DST_EndDay = 5
            break;
        case 4:
            DST_EndDay = 4
            break;
        case 5:
            DST_EndDay = 3
            break;
        case 6:
            DST_EndDay = 2
            break;
     }
    var DST_off_Date = new Date()
    DST_off_Date = DST_off_Date.setFullYear(myYear,10,DST_EndDay)

    var toDay = new Date();

    /*if today is between Daylight Savings On and Off times */
    if (today>DST_on_Date && today<DST_off_Date) {
        dst = 1;    
    }

надеюсь, что это поможет!

-RL