экономия времени обнаружения PHP дневного света

голоса
25

Мне нужно отправить по электронной почте пользователям, основанных в любой точке мира в 9:00 утра по местному времени. Сервер находится в Великобритании. Что я могу сделать, это установить разницу во времени между каждым пользователем и времени сервера, который затем отлично работать, если DST не существует.

Вот пример для иллюстрации:

  • Джон работает в Нью-Йорке, -5 часов от сервера (Великобритания) время
  • Ричард работает в Лондоне, Великобритания, поэтому час разница 0 с сервером.

Когда сервер выходит из Гринвичу GMT +1 (BST) в 2:00 утра на определенное воскресенье, это означает, что Джон теперь имеет разницу -6H времени.

Этот сценарий я все еще могу справиться путем обновления всех пользователей за пределами местного времени сервера, но когда я переместил вперед / назад время всех других пользователей, я все еще нужен способ , чтобы обнаружить когда (дату и время) пользователь , живущим за пределы Великобритании будет (или не будет) изменить свое местное время вероятного DST один.

Мне нужен метод PHP, чтобы знать / обнаружить, когда другие части мира входа / выхода из перехода на летнее время.

Задан 27/05/2011 в 17:35
источник пользователем
На других языках...                            


3 ответов

голоса
12

Изменение мой ответ немного: DateTimeZone :: getTransitions выглядит , как он будет делать то , что вам нужно, если у вас есть PHP> = 5.2.

Из комментария в документации:

<?php 
$theTime = time(); // specific date/time we're checking, in epoch seconds. 

$tz = new DateTimeZone('America/Los_Angeles'); 
$transition = $tz->getTransitions($theTime, $theTime); 

// only one array should be returned into $transition. Now get the data: 
$offset = $transition[0]['offset']; 
$abbr = $transition[0]['abbr']; 
?>

Так вот, все, что нам нужно сделать, это пройти в часовом поясе, который мы хотим проверить, и мы можем знать, что часовой пояс в DST /, что смещение есть. Затем вам необходимо проверить смещение от GMT, чтобы увидеть, если вы хотите, чтобы отправить электронную почту прямо сейчас, или не сейчас.

Ответил 27/05/2011 в 17:40
источник пользователем

голоса
23

Вы должны знать все подробности DST перехода себя ли? или вы просто должны знать, когда это 9:00 утра в данном часовом поясе?

Если это последнее, PHP может использовать базу данных часового пояса операционной системы , чтобы сделать это для вас. StrToTime () функция удивительно хорошо «выяснить» , что вы имеете в виду:

echo strtotime("today 9:00 am America/New_York");  // prints "1306501200"
echo strtotime("today 9:00 am Europe/London");     // prints "1306483200"

Просто убедитесь , что вы используете один из PHP поддерживается часовых поясов .

Ответил 27/05/2011 в 19:40
источник пользователем

голоса
19

Как Джимми указывает вы можете использовать часовой пояс переходов, но это не доступно на PHP <5.3. в dateTimeZone () является PHP> = 5.2.2, но getTransitions () с аргументами нет! В этом случае здесь есть функция, которая может дать вам часовой пояс данных, в том числе ли в DST или нет.

function timezonez($timezone = 'Europe/London'){
    $tz = new DateTimeZone($timezone);
    $transitions = $tz->getTransitions();
    if (is_array($transitions)){
        foreach ($transitions as $k => $t){
            // look for current year
            if (substr($t['time'],0,4) == date('Y')){
                $trans = $t;
                break;
            }
        }
    }
    return (isset($trans)) ? $trans : false;
}

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

date_default_timezone_set('Europe/London');
$bool = date('I'); // this will be 1 in DST or else 0

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

Ответил 14/06/2012 в 13:02
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more