Как получить формат даты из iso8601 datei и время в Perl - PullRequest
1 голос
/ 24 октября 2019

Я анализирую данные и получаю дату. Затем я преобразовываю это в объект iso8601. Однако я застреваю, пытаясь получить только формат даты год-месяц.

use DateTime::Format::ISO8601;
use POSIX qw(strftime);
my $dt_str = 'Frank_Gibson.20180703T230600.Program_Manager.New_York.doc';
my @perl_time_array = split /\./, $dt_str;
my $dt = DateTime::Format::ISO8601->parse_datetime($perl_time_array[1]);

печатает 2018-07-03T23:06:00 Как мне получить только дату? Я пытался использовать

$dt = strftime('%Y-%m-%d',$dt);

Но я получаю следующую ошибку:

Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at /home/pi/code/perl/perl_regex_lookahead.pl line 26.

Я просто использую регулярное выражение, чтобы получить то, что я ищу, или есть способформатирование с использованием DateTime::Format::ISO8601 или strftime

Ответы [ 2 ]

5 голосов
/ 24 октября 2019

Здесь есть две подпрограммы, называемые strftime(), и я думаю, что это вас немного смущает.

Вы (случайно?) Вызываете функцию strftime() из модуля POSIXи, как говорится в вашем сообщении об ошибке, подпрограмма ожидает очень специфических аргументов (в основном это список значений, которые вы возвращаете из localtime() или gmtime()).

Но вам не нужно этого делать. Ваша переменная $dt является объектом класса DateTime. И у DateTime объектов есть свой собственный метод strftime(), который можно вызывать для объекта.

$dt->strftime('%Y-%m-%d'); # 2018-07-03

Стоит также отметить, что метод strftime() действительно предназначен только для создания строк в более неясную дату. и форматы времени. Для распространенных форматов класс DateTime имеет другие методы, которые вы можете использовать. Например, требуемый формат даты можно создать с помощью метода ymd().

$dt->ymd; # 2018-07-03

Все это означает, что вы можете удалить строку use POSIX из своего кода. Вы не будете использовать этот модуль вообще. Все, что вам нужно, находится в классе DateTime.

1 голос
/ 24 октября 2019

Вы можете создать гибкий анализатор DateTime с DateTime :: Format :: Builder . В качестве примера вы можете увидеть исходный код из DateTime :: Format :: MySQL . Например:

package MyTimeParser;
use strict;
use warnings;

use DateTime;
use DateTime::Format::Builder
(
    parsers => {
        parse_datetime => [
            {
                # 20180703T230600
                regex => qr/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})$/,
                params => [qw( year month day hour minute second )],
            },
            # here you can describe another format
        ],
    }
);
1;

package main;
use strict;
use warnings;

my $dt_str = 'Frank_Gibson.20180703T230600.Program_Manager.New_York.doc';
my @perl_time_array = split /\./, $dt_str;

# 2018-07-03
print MyTimeParser->parse_datetime( $perl_time_array[1] )->ymd('-');

exit;
...