Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > пакет Date::Manip


Автор: HeR0vn1k 19.10.2007, 10:29
Здравствуйте.
Пользуюсь пакетом Date::Manip. Ни как не могу распарсить русский формат дат.

Если использовать такой вариант "today"  или "11 december 2006" :
Код

use Date::Manip qw(Date_Init ParseDate UnixDate);
&Date_Init("TZ=EST", "DateFormat=non-US");

my $today = "today";
my $date = ParseDate($today);
print $date;
или
Код

my $today = "11 december 2006";
my $date = ParseDate($today);
print $date;
то парсер всё определяет, а если руский вариант "сегодня" или "11 декабря 2006" :
Код

use Date::Manip qw(Date_Init ParseDate UnixDate);
&Date_Init("TZ= GMT", "DateFormat=RU");
# или такой вариант
&Date_Init('TZ= ZP5', 'Language=Russian', 'DateFormat=non-US');

my $today = "сегодня";
my $date = ParseDate($today);
print $date;
или
Код

my $today = "11 декабря 2006";
my $date = ParseDate($today);
print $date;
так не получается. Выдает undef.

Что именно нужно прописать в Date_Init, чтоб парсер с русской строки определял даты?

Автор: nitr 19.10.2007, 13:09
Код

Date_Init("Language=Russian","DateFormat=non-US");

ну если Russian не срабатывает (и верить докам), то
Цитата

NOTE: Some date forms do not work as well in languages other than English, but this is not because Date::Manip is incapable of doing so (almost nothing in this module is language dependent). It is simply that I do not have the correct translation available for some words. If there is a date form that works in English but does not work in a language you need, let me know and if you can provide me the translation, I will fix Date::Manip.



Автор: HeR0vn1k 19.10.2007, 13:58
нет, не в этом проблема. Русский язык поддерживается (примерно) с версии 5.42! Псоледняя на сегодня Version5.45. Пока ковырялся нашел причину. Все данные передаются на Linux сервер, а там русского нет и поэтому названия "сегодня", "вчера" и пр. написаны в другой кодировке. 
Вот исходники пакета Date::Manip:
Код

sub Date_Init_Russian {
  print "DEBUG: Date_Init_Russian\n"  if ($Curr{"Debug"} =~ /trace/);
  my($d)=@_;
  my(%h)=();
  &Char_8Bit(\%h);
  my($a) =$h{"a:"};
#...
$$d{"years"}   =["\xc7","\xc7\xc4","\xc7\xcf\xc4","\xcc\xc5\xd4",
                   "\xcc\xc5\xd4","\xc7\xcf\xc4\xc1"];
  $$d{"months"}  =["\xcd\xc5\xd3","\xcd\xc5\xd3\xd1\xc3",
                   "\xcd\xc5\xd3\xd1\xc3\xc5\xd7"];
  $$d{"weeks"}   =["\xce\xc5\xc4\xc5\xcc\xd1","\xce\xc5\xc4\xc5\xcc\xd8",
                   "\xce\xc5\xc4\xc5\xcc\xc9","\xce\xc5\xc4\xc5\xcc\xc0"];
#...

Теперь буду писать конвектор с русского на нужную кодировку.

Автор: nitr 19.10.2007, 16:11
HeR0vn1k, зачем? smile
здесь только недавно решалась такая же "проблема"
см. http://forum.vingrad.ru/index.php?showtopic=176606&view=findpost&p=1286468

Автор: HeR0vn1k 19.10.2007, 22:24
всё сделал через пакет конвертации. Две строки и заработало.
перевел с windows-1251 в KOI8-R и RU строки стали такого вида: \xce\xc5\xc4\xc5\xcc\xd1.

Вот перевод пакета Manip русского формата^
Код

{
    ‘next’ => [
        ‘следующий’
    ],
    ‘sepss’ => ‘[:.с]’,
    ‘day_name’ => [
        [
            ‘понедельник’,
            ‘вторник’,
            ‘среда’,
            ‘четверг’,
            ‘пятница’,
            ‘суббота’,
            ‘воскресенье’
        ]
    ],
    ‘on’ => [
        ‘в’
    ],
    ‘day_char’ => [
        [
            ‘пн’,
            ‘вт’,
            ‘ср’,
            ‘чт’,
            ‘пт’,
            ‘сб’,
            ‘вс’
        ]
    ],
    ‘month_name’ => [
        [
            ‘января’,
            ‘февраля’,
            ‘марта’,
            ‘апреля’,
            ‘мая’,
            ‘июня’,
            ‘июля’,
            ‘августа’,
            ‘сентября’,
            ‘октября’,
            ‘ноября’,
            ‘декабря’
        ],
        [
            ‘январь’,
            ‘февраль’,
            ‘март’,
            ‘апрель’,
            ‘май’,
            ‘июнь’,
            ‘июль’,
            ‘август’,
            ‘сентябрь’,
            ‘октябрь’,
            ‘ноябрь’,
            ‘декабрь’
        ]
    ],
    ‘years’ => [
        ‘г’,
        ‘гд’,
        ‘год’,
        ‘лет’,
        ‘лет’,
        ‘года’
    ],
    ‘future’ => [
        ‘вперед на’
    ],
    ‘business’ => [
        ‘рабочих’
    ],
    ‘past’ => [
        ‘назад на ’
    ],
    ‘month_abb’ => [
        [
            ‘янв’,
            ‘фев’,
            ‘мрт’,
            ‘апр’,
            ‘май’,
            ‘июн’,
            ‘июл’,
            ‘авг’,
            ‘снт’,
            ‘окт’,
            ‘нояб’,
            ‘дек’
        ],
        [
            ‘’,
            ‘фвр’,
            ‘’,
            ‘',
            ’мая’,
            ‘’,
            ‘',
            ’',
            ‘сен’,
            ‘окт’,
            ‘ноя’,
            ‘’
        ]
    ],
    ‘num_suff’ => [
        [
            ‘1 ’,
            ‘2 ’,
            ‘3 ’,
            ‘4 ’,
            ‘5 ’,
            ‘6 ’,
            ‘7 ’,
            ‘8 ’,
            ‘9 ’,
            ‘10 ’,
            ‘11 ’,
            ‘12 ’,
            ‘13 ’,
            ‘14 ’,
            ‘15 ’,
            ‘16 ’,
            ‘17 ’,
            ‘18 ’,
            ‘19 ’,
            ‘20 ’,
            ‘21 ’,
            ‘22 ’,
            ‘23 ’,
            ‘24 ’,
            ‘25 ’,
            ‘26 ’,
            ‘27 ’,
            ‘28 ’,
            ‘29 ’,
            ‘30 ’,
            ‘31 ’
        ]
    ],
    ‘hours’ => [
        ‘ч’,
        ‘ч.’,
        ‘чс’,
        ‘чсв’,
        ‘час’,
        ‘часов’,
        ‘часа’
    ],
    ‘each’ => [
        ‘каждый’
    ],
    ‘minutes’ => [
        ‘мн’,
        ‘мин’,
        ‘минута’,
        ‘минут’
    ],
    ‘sepms’ => ‘[:м]’,
    ‘replace’ => [],
    ‘pm’ => [
        ‘пп’,
        ‘ПП’,
        ‘П.П.’,
        ‘дня’,
        ‘вечера’,
        ‘после полудня’,
        ‘по полудню’
    ],
    ‘sephm’ => ‘[:ч]’,
    ‘num_word’ => [
        [
            ‘первый’,
            ‘второй’,
            ‘третий’,
            ‘четвертый’,
            ‘пятый’,
            ‘шестой’,
            ‘седьмой’,
            ‘восьмой’,
            ‘девятый’,
            ‘десятый’,
            ‘одиннадцатый’,
            ‘двенадчатый’,
            ‘тренадцатый’,
            ‘четырнадцатый’,
            ‘пятнадцатый’,
            ‘шестнадцатый’,
            ‘семьнадцатый’,
            ‘восемьнадцатый’,
            ‘девятнадцатый’,
            ‘двадцатый’,
            ‘двадцать первый’,
            ‘двадцать второй’,
            ‘двадцать третий’,
            ‘двадцать четвертый’,
            ‘двадцать пятый’,
            ‘двадцать шестой’,
            ‘двадцать седьмой’,
            ‘двадцать восьмой’,
            ‘двадцать девятый’,
            ‘тридцатый’,
            ‘тридцать первый’
        ],
        [
            ‘первое’,
            ‘второе’,
            ‘третье’,
            ‘четвертое’,
            ‘пятое’,
            ‘шестое’,
            ‘седьмое’,
            ‘восьмое’,
            ‘девятое’,
            ‘десятое’,
            ‘одиннадцатое’,
            ‘двенадцатое’,
            ‘тренадцатое’,
            ‘четырнадцатое’,
            ‘пятнадцатое’,
            ‘шестнадцатое’,
            ‘семьнадцатое’,
            ‘восемьнадцатое’,
            ‘девятнадцатое’,
            ‘двадцатое’,
            ‘двадцать первое’,
            ‘двадцать второе’,
            ‘двадцать третье’,
            ‘двадцать четвертое’,
            ‘двадцать пятое’,
            ‘двадцать шестое’,
            ‘двадцать седьмое’,
            ‘двадцать восьмое’,
            ‘двадцать девятое’,
            ‘тридцатое’,
            ‘тридцать первое’
        ],
        [
            ‘первого’,
            ‘второго’,
            ‘третьего’,
            ‘четвертого’,
            ‘пятого’,
            ‘шестого’,
            ‘седьмого’,
            ‘восьмого’,
            ‘девятого’,
            ‘десятого’,
            ‘одиннадцатого’,
            ‘двенадцатого’,
            ‘тренадцатого’,
            ‘четырнадцатого’,
            ‘пятнадцатого’,
            ‘шестнадцатого’,
            ‘семьнадцатого’,
            ‘восемьнадцатого’,
            ‘девятнадцатого’,
            ‘двадцатого’,
            ‘двадцать первого’,
            ‘двадцать второе’,
            ‘двадцать третьего’,
            ‘двадцать четвертого’,
            ‘двадцать пятого’,
            ‘двадцать шестого’,
            ‘двадцать седьмого’,
            ‘двадцать восьмого’,
            ‘двадцать девятого’,
            ‘тридцатого’,
            ‘тридцать первого’
        ]
    ],
    ‘months’ => [
        ‘мес’,
        ‘месяц’,
        ‘месяцев’
    ],
    ‘day_abb’ => [
        [
            ‘пнд’,
            ‘втр’,
            ‘срд’,
            ‘чтв’,
            ‘птн’,
            ‘суб’,
            ‘вск’
        ],
        [
            ‘пон’,
            ‘вто’,
            ‘срe’,
            ‘чет’,
            ‘пят’,
            ‘суб’,
            ‘воск’
        ]
    ],
    ‘of’ => [
        ‘ ’
    ],
    ‘later’ => [
        ‘позже’
    ],
    ‘seconds’ => [
        ‘с’,
        ‘сек’,
        ‘секунда’,
        ‘секунд’
    ],
    ‘am’ => [
        ‘дп’,
        ‘П’,
        ‘.П.’,
        ‘ночи’,
        ‘утра’,
        ‘до полудня’
    ],
    ‘at’ => [
        ‘в’
    ],
    ‘offset’ => [
        ‘позавчера’,
        ‘-0:0:0:2:0:0:0’,
        ‘вчера’,
        ‘-0:0:0:1:0:0:0’,
        ‘завтра’,
        ‘+0:0:0:1:0:0:0’,
        ‘послезавтра’,
        ‘+0:0:0:2:0:0:0’
    ],
    ‘prev’ => [
        ‘предыдущий’
    ],
    ‘approx’ => [
        ‘примерно’
    ],
    ‘last’ => [
        ‘последний’
    ],
    ‘exact’ => [
        ‘точно’
    ],
    ‘days’ => [
        ‘д’,
        ‘день’,
        ‘дней’,
        ‘дня’
    ],
    ‘today’ => [
        ‘сегодня’
    ],
    ‘now’ => [
        ‘сейчас’
    ],
    ‘times’ => [
        ‘полдень’,
        ‘12:00:00’,
        ‘полночь’,
        ‘00:00:00’
    ],
    ‘weeks’ => [
        ‘неделя’,
        ‘недель’,
        ‘недели’,
        ‘неделю’
    ]
};

но как почитал в Инете, по английски этот пакет понимает больше. В русском хоть возможность вариантов написания хорошо реализована, но всё равно есть промахи.

Автор: HeR0vn1k 22.10.2007, 07:29
http://cpan.uwinnipeg.ca/htdocs/Date-Manip/Date/Manip.html Date::Manip (Eng ver.)^

Список поддержки языков^
English      (default)
French       (5.02)
Swedish      (5.05)
German       (5.31)
Dutch        (5.32)     aka Nederlands
Polish       (5.32)
Spanish      (5.33)
Portuguese   (5.34)
Romanian     (5.35)
Italian      (5.35)
Russian      (5.41)
Turkish      (5.41)
Danish       (5.41)

Автор: nitr 22.10.2007, 13:07
Так в цитате и сказано - если есть проблемы с работой в др. языках - пишите, исправит

Автор: HeR0vn1k 22.10.2007, 13:18
хорошо. Внесу свою лепту - чтоб по всем падежам разговаривал. А то не звучит запрос "первый пятница сентября"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)