Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Непонятки с форматом даты в iso8601
Форумы портала PHP.SU » » Кодировки и все смежное » Непонятки с форматом даты в iso8601

Страниц (1): [1]
 

1. nkl - 15 Октября, 2014 - 11:55:51 - перейти к сообщению
Всем привет. Заблудился в трёх соснах что называется...
Что делаем: регулярно получаем некоторые данные с некоторых серверов, агрегируем их и выявляем идентичные.
У каждой строки данных есть дата. Она тоже должна участвовать в процессе агрегации, т.к. является неотъемлемой частью определения идентичности полученных данных. Проблема в том, что все сервера присылают данные в разных форматах. Вот например, контрольная дата и время строки данных по московскому часовому поясу (2014-10-18 19:30:00). Один сервер присылает дату для этой строки в таком виде: 2014-10-19T06:00:00-0400, второй в таком: 2014-10-18T19:30:00.000+03:00, а третий вообще вот так 1413646200000. Я так понимаю, здесь просто разные часовые пояса и если привести эти даты к общему часовому поясу, то получим 2014-10-18 19:30:00, вопрос в том, как определить в каком часовом поясе приходят даты с разных серверов, что бы корректировать их под один общий и вообще, каким считать общий часовой пояс, с учетом того, что в РФ переводят часы в зависимости от времени года.
2. Sail - 15 Октября, 2014 - 12:22:57 - перейти к сообщению
nkl, посмотрите, быть может, окажется полезно:
PHP:
скопировать код в буфер обмена
  1. $arr = array('2014-10-19T06:00:00-0400', '2014-10-18T19:30:00.000+03:00', '1413646200000');
  2. $aOdt = array();
  3. foreach ($arr as $value) {
  4.     if(is_numeric($value)) {
  5.         $aOdt[] = new DateTime();
  6.         $aOdt[count($aOdt) - 1]->setTimestamp($value/1000);
  7.     } else {
  8.         $aOdt[] = new DateTime($value);
  9.     }
  10.     echo $value.' == '.$aOdt[count($aOdt) - 1]->format('Y-m-d H:i:s').'<br>';
  11.     echo $aOdt[count($aOdt) - 1]->getTimezone()->getName().'<br>';
  12. }
  13.  
3. Мелкий - 15 Октября, 2014 - 12:28:37 - перейти к сообщению
nkl пишет:
2014-10-19T06:00:00-0400

На 30 минут не тянет никак. Все значения для примера? Они показывают разное глобальное время.

PHP:
скопировать код в буфер обмена
  1. (new datetime('2014-10-18T19:30:00.000+03:00'))->setTimezone(new DateTimeZone('Europe/Moscow'))

Получите объект datetime в своём часовом поясе.
Таймштамп не предполагает временных зон. Для него придётся ручками выяснить и указать таймзону.

nkl пишет:
с учетом того, что в РФ переводят часы в зависимости от времени года.

Хм, вас недавно разморозили? Ещё Медведев отменил перевод часов.
4. Sail - 15 Октября, 2014 - 12:32:48 - перейти к сообщению

Мелкий пишет:
Хм, вас недавно разморозили? Ещё Медведев отменил перевод часов.

Не поверите! Ожидается ещё один (как минимум) перевод... Ниндзя Буквально вот-вот...
5. Мелкий - 15 Октября, 2014 - 12:38:28 - перейти к сообщению

Sail пишет:
Не поверите! Ожидается ещё один (как минимум) перевод...

Знаю, но зависимости от времени года-то нету - только от погоды на Нептуне (штормит Радость ).
6. nkl - 15 Октября, 2014 - 12:55:19 - перейти к сообщению
Пардоньте господа, данные для примера действительно неверные. Вот верные:
PHP:
скопировать код в буфер обмена
  1. $srvr1 = "2014-10-18T11:30:00-0400";
  2. $srvr2 = "014-10-18T19:30:00.000+03:00";
  3. $srvr3 = 1413646200000;

В каком часовом поясе эти даты точно известно для $srvr3 в московском.
Коллега предложил такой вариант для получения московской временной зоны для первых двух дат:
PHP:
скопировать код в буфер обмена
  1. $dt = new DateTime('2014-10-18T11:30:00-0400');
  2. $tz = new DateTimeZone(date_default_timezone_get());
  3. $dt->setTimezone($tz);
  4. print "T1: " . $dt->format('Y-m-d H : i : s') . "\n";

Проверил, все правильно.
(Добавление)
С учетом того, что сервак по московскому времени работает.
(Добавление)
Ха! И что б вы думали! Авторы второго сервера #бъебались с часовым поясом! Щас связался с ними, подтвердили, что указание часового пояса +03:00 начнет корректно работать с 26 октября, а сейчас просто не нужно обращать на него внимание.

Всем спасибо, тему можно закрывать. Хорошо

 

Powered by ExBB FM 1.0 RC1