Xpoint
   [напомнить пароль]

Модуль для парсинга и конвертации дат и времени

Метки: [без меток]
2010-03-25 03:42:21 [обр] Jared(0/26)[досье]

Есть необходимость парсить и конвертировать дату и время из нескольких форматов в несколько. А точнее:

Mar 23 19:38:51 (такую дату-время генерит syslog)
Tue, 23 Mar 2010 19:38:51 +0300 GMT (требование спецификации RSS 2.0 - "All date-times in RSS conform to the Date and Time Specification of RFC822(ietf), with the exception that the year may be expressed with two characters or four characters (four preferred)")
2010-03-23 19:38:51 (то, что ожидает получить mysql)

После прочтения этого документа и ползанья по CPAN с относительно поверхностным обзором документации модулей Date::* так ничего подходящего, умеющего и парсить и выдавать строку в нужном формате да еще и желательно с ОО-интерфейсом найти не удалось.
А хотелось бы:

my $date = new Date::LovelyParsingConverter ($date_string); # auto parsing
print $date->as_syslog;
print $date->as_rfc822;
print $date->as_mysql;

Вероятно просто не нашел чего-то на поверхности. Может кто-нибудь подскажет подобный модуль, а то устал для такой простой операции рождать многострочных монстров со справочными переменными в стиле:

use POSIX qw(strftime);
use Time::Local;
use strict;

my %months = 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);

# $ARGV[1] is a syslog entry
# unpack tpl is>> mon  day   hour:min:sec message <<
#                  0    1     2    3   4    5
my @item = unpack('A3 x A2 x A2 x A2 x A2 x A*', $ARGV[1]);
my $time = strftime('%a, %d %b %Y %H:%M:%S', localtime(timelocal($item[4], $item[3], $item[2], $item[1], $months{$item[0]}, [localtime]->[5])));

P.S. Я, конечно, в курсе, что mysql умеет конвертировать даты и можно полностью возложить на нее эту работу, но система распределенная, СУБД есть не везде и не везде нужна. К тому же ее использование не освобождает от необходимости городить нечитаемые форматы со всякими %whatever.

спустя 4 часа 23 минуты [обр] Евгений Седов aka KPbIC(9/187)[досье]
Вдобавок к названному, берете Time::Local, HTTP::Date, ..., и пишите свой модуль с нужными вам методами.
спустя 2 минуты [обр] arto(81/497)[досье]
сообщение промодерировано
спустя 5 часов [обр] Сергей Пантелеев(3/15)[досье]
Time::ParseDate
спустя 44 минуты [обр] Филипп Ткачев(0/115)[досье]
Да... Perl'у явно не хватает такой фукции как date()
спустя 1 день 8 часов [обр] Jared(0/26)[досье]
Time::ParseDate

Спасибо, то что нужно для парсинга даты-времени.

Вдобавок к названному, берете Time::Local, HTTP::Date, ..., и пишите свой модуль с нужными вам методами.

Это просто напрашивается. Пока приходится обходиться %-style форматами. Может когда-нибудь соберусь модуль написать.

perldoc POSIX::strftime
perldoc POSIX::strptime

Оно и понятно. Но это не тот функционал, который хотелось бы.

Да... Perl'у явно не хватает такой фукции как date()

Как уже было сказано, у Perl есть POSIX, у которого есть strftime. Так что всего хватает =)

Powered by POEM™ Engine Copyright © 2002-2005