Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование даты с учетом часового пояса 
V
    Опции темы
phprus
Дата 23.1.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: нет
Всего: 3



Имеется лог сервера nginx.
После его разбора я получаю дату и время запроса (например такую: '24/Jan/2008:00:21:46 +0500'). Необходимо преобразовать эту дату в формат 'YYYY-MM-DD HH:MM:SS' с учетом того что если исходное время было в часовом поясе сервера, то результирующее время должно быть в   GMT. Если бы этого условия не было то задачу можно было бы решить обычным регулярным выражением и заменой названия месяца на его номер. Но мне нужно получить время GMT и в этом месте у меня возникает проблема. Я не могу придумать способа для учета часового пояса (в данном случае +0500) для вычисления правильного времени.

На модуль Date::Manip я смотрел, но так и не понял как им пользоваться и может ли он мне помочь.

По этому я и обратился на форум за помощью. Надеюсь, что Вы мне поможете.
PM MAIL WWW ICQ   Вверх
AlexPet
Дата 24.1.2008, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Например, Date::Calc ( http://search.cpan.org/~stbey/Date-Calc-5.4/Calc.pod )
Код

($year,$month,$day, $hour,$min,$sec) = Add_Delta_DHMS($year,$month,$day, $hour,$min,$sec, $Dd,$Dh,$Dm,$Ds);

И еще можно декодировать номер месяца:
Код

$month = Decode_Month($string);

Ну и пр. Вообще интересный модуль на все случаи жизни.
PM MAIL ICQ Jabber   Вверх
amg
Дата 24.1.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Или вот (с использованием стандартного модуля)
Код

use POSIX;
%M = qw(Jan 0 Feb 1 Mar 2 Apr 3 May 4 Jun 5 Jul 6 Aug 7 Sep 8 Oct 9 Nov 10 Dec 11);

$date = '24/Jan/2008:00:21:46 +0500';
($mday,$mon,$year,$hour,$min,$sec,$gmt) = $date=~m|^(\d+)/(\w+)/(\d+):(\d+):(\d+):(\d+) ([+-]\d+)|;
print strftime("%Y-%m-%d %H:%M:%S", $sec, $min, $hour-$gmt/100, $mday, $M{$mon}, $year-1900);



Это сообщение отредактировал(а) amg - 24.1.2008, 10:24
PM MAIL   Вверх
phprus
Дата 24.1.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: нет
Всего: 3



AlexPet
Спасибо за ссылку на модуль.

Цитата(amg @  24.1.2008,  10:04 Найти цитируемый пост)
print strftime("%Y-%m-%d %H:%M:%S", $sec, $min, $hour-$gmt/100, $mday, $M{$mon}, $year-1900);

А разве strftime умеет принимать отрицательное и может быть дробное значения параметра который передает часы? И веть на сколько я помню с 0 начинаются 8-иричные числа. Не будет ли этой проблемы при вычислении выражения $gmt/100, да и остальных тоже?
PM MAIL WWW ICQ   Вверх
amg
Дата 24.1.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(phprus @  24.1.2008,  11:05 Найти цитируемый пост)
А разве strftime умеет принимать отрицательное и может быть дробное значения параметра который передает часы? И веть на сколько я помню с 0 начинаются 8-иричные числа. Не будет ли этой проблемы при вычислении выражения $gmt/100, да и остальных тоже?
strftime, оказывается, умеет принимать отрицательные числа. С дробными не проверял, но их и быть не должно (строка и датой всегда оканчивается на 2 нуля, или нет?). Восьмеричные числа начинаются на "\0", а '+05'==5

PM MAIL   Вверх
phprus
Дата 24.1.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: нет
Всего: 3



Цитата(amg @  24.1.2008,  11:20 Найти цитируемый пост)
С дробными не проверял, но их и быть не должно (строка и датой всегда оканчивается на 2 нуля, или нет?)

На нашей планете есть часовые пояса сдвинутые на не целое количество часов, но поддержку этого я уже сам смогу написать.

Цитата(amg @  24.1.2008,  11:20 Найти цитируемый пост)
Восьмеричные числа начинаются на "\0", а '+05'==5

Действительно. Похоже что строки начинающиеся с 0 считаются десятичными числами.

Еще раз спасибо всем за помощь.
PM MAIL WWW ICQ   Вверх
amg
Дата 24.1.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(phprus @  24.1.2008,  11:56 Найти цитируемый пост)
На нашей планете есть часовые пояса сдвинутые на не целое количество часов, но поддержку этого я уже сам смогу написать.
Можно вместо $hour-$gmt/100 использовать $sec-$gmt*36 (дробные величины strftime действительно не поддерживает, а выходящие за разумные пределы, в т.ч. отрицательные - пожалуйста)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.