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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Непонятки с форматом даты в iso8601

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: нихера не могу вдуплить
nkl
Отправлено: 15 Октября, 2014 - 11:55:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Всем привет. Заблудился в трёх соснах что называется...
Что делаем: регулярно получаем некоторые данные с некоторых серверов, агрегируем их и выявляем идентичные.
У каждой строки данных есть дата. Она тоже должна участвовать в процессе агрегации, т.к. является неотъемлемой частью определения идентичности полученных данных. Проблема в том, что все сервера присылают данные в разных форматах. Вот например, контрольная дата и время строки данных по московскому часовому поясу (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, вопрос в том, как определить в каком часовом поясе приходят даты с разных серверов, что бы корректировать их под один общий и вообще, каким считать общий часовой пояс, с учетом того, что в РФ переводят часы в зависимости от времени года.
 
 Top
Sail
Отправлено: 15 Октября, 2014 - 12:22:57
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 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.  
 
 Top
Мелкий Супермодератор
Отправлено: 15 Октября, 2014 - 12:28:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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 пишет:
с учетом того, что в РФ переводят часы в зависимости от времени года.

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


-----
PostgreSQL DBA
 
 Top
Sail
Отправлено: 15 Октября, 2014 - 12:32:48
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)





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

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



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)





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

Знаю, но зависимости от времени года-то нету - только от погоды на Нептуне (штормит Радость ).


-----
PostgreSQL DBA
 
 Top
nkl
Отправлено: 15 Октября, 2014 - 12:55:19
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Пардоньте господа, данные для примера действительно неверные. Вот верные:
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 октября, а сейчас просто не нужно обращать на него внимание.

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

(Отредактировано автором: 15 Октября, 2014 - 14:16:36)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Кодировки и все смежное »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB