Время смещения для перехода на летнее время в одном конкретном часовом поясе с использованием JavaScript - PullRequest
7 голосов
/ 07 июля 2010

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

Вот что у меня есть.«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();

Ответы [ 3 ]

2 голосов
/ 07 июля 2010

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

Тогда вам нужен «динамический» скрипт для получения статуса DST.

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

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

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

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

1 голос
/ 07 июля 2010

Я также боролся с этим раньше на веб-сайте на основе 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, проверьте эта страница .

0 голосов
/ 01 апреля 2015

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

Чтобы вычислить дату начала летнего времени, сначала мы рассчитываем текущий год, а затем, на какой день недели приходится первое марта, и на основании этого мы можем вычислить второе воскресенье.То же самое делается для ноября, и, наконец, проверка того, попадает ли сегодняшняя дата между двумя опорными датами.Значение 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

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