Проблемы с часовым поясом и переходом на летнее время - PullRequest
2 голосов
/ 07 марта 2012

Я просматривал другие решения для SO, и ни одно из них, похоже, не решает проблему часового пояса / dst в следующем отношении.

Я звоню в API прогнозирования приливов NOAA и API-интерфейс Национальной метеорологической службы NOAA , для передачи которого требуется диапазон времени.Для каждого местоположения в моей базе данных у меня есть часовой пояс как смещение UTC и наблюдается ли летнее время (1 или 0).Я пытаюсь отформатировать некоторые даты (сегодня и завтра), чтобы они соответствовали LST (местному стандартному времени) в его собственном часовом поясе, чтобы я мог перейти к этим API.

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

Вот что у меня есть:

// Get name of timezone for tide station
// NOTE: $locationdata->timezone is something like "-5"
$tz_name = timezone_name_from_abbr("", $locationdata->timezone * 3600, false);
$dtz = new DateTimeZone($tz_name);    

// Create time range
$start_time = new DateTime('', $dtz);
$end_time = new DateTime('', $dtz);
$end_time = $end_time->modify('+1 day');

// Modify time to match local timezone
$start_time->setTimezone($dtz);
$end_time->setTimezone($dtz);

// Adjust for daylight savings time
if( $locationdata->dst == '1' )
{
   // DST is observed in this area. 

   // ** HOW DO I KNOW IF TODAY IS CURRENTLY DST OR NOT? **  

}           

// Make call to API using modified time range
...

Как мне поступить?этот?Спасибо.

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

Вы можете использовать функции времени и даты в PHP:

$tzObj = timezone_open($tz_name);
$dateObj = date_create("07.03.2012 10:10:10", $tzObj);

$dst_active = date_format($dateObj, "I");

Если летнее время активно на указанную дату, $dst_active равно 1, иначе 0.

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

Однако, как упоминал Джон, разные страны в пределах одного и того же смещения часового пояса могут наблюдатьDST, в то время как другие не могут.

1 голос
/ 07 марта 2012

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

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

По сути, ваша база данных должна содержать идентификатор часового пояса, а не смещение / DST-true-or-false. (Предполагая, что PHP использует базу данных часовых поясов zoneinfo, идентификатор часового пояса выглядит как «Европа / Лондон».)

РЕДАКТИРОВАТЬ: Чтобы найти смещение данного DateTime, вы можете позвонить getOffset, который затем можно сравнить со стандартным смещением времени. Но если у вас нет окончательного идентификатора часового пояса, вы будете рискнуть получить неправильную зону.

0 голосов
/ 08 марта 2012

Cillosis, я надеюсь, что вы не работаете с Java!Я боролся со временем все время.Я также работаю с погодными данными.Большая часть данных, которые я использую, представлена ​​по местному стандартному времени (без учета летнего времени).Я также должен использовать время из других часовых поясов и обнаружил, что Java продолжает читать часовой пояс моего компьютера.Я также продолжал сталкиваться с устаревшими классами.Я придумал решение, которое работает.Это что-то вроде клуге, поэтому я тщательно документировал его, и он существует только в одной функции.Мое решение - относительное время.Я установил местное время в UTC.Я вычитаю смещение по Гринвичу вместо того, чтобы добавить его.Меня не волнует фактическое время, все, что меня волнует, это разница между двумя временами.Это работает очень хорошо.Удачи

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