ггггммддччммсс в гггг-мм-дд чч: мм: сс в perl? - PullRequest
4 голосов
/ 09 февраля 2012

Как лучше всего конвертировать ггггммддччммсс в ГГГГ-ММ-ДД чч: мм: сс и обратно в perl?

, например: 20130218165601 в 2013-02-18 16:56:01 и обратно?(может https://metacpan.org/module/Rose::DateTime сделать это)?

без регулярных выражений, если возможно;)

Ответы [ 3 ]

6 голосов
/ 09 февраля 2012

Быстрое решение с sprintf.

my $date = sprintf "%s%s-%s-%s %s:%s:%s", $string =~ /(..)/g;

И обратно:

my $foo = join '', $date =~ /\d+/g;
6 голосов
/ 09 февраля 2012

Модуль излишним для этого.

# Packed -> ISO
(my $iso_date = $packed_date) =~
   s/^(....)(..)(..)(..)(..)(..)\z/$1-$2-$3 $4:$5:$6/s;

# ISO -> Packed
(my $packed_date = $iso_date) =~
   s/^(....)-(..)-(..) (..):(..):(..)\z/$1$2$3$4$5$6/s;

Rose :: DateTime не может проанализировать «упакованный» формат, как предполагалось, но вы можете использовать DateTime :: Format :: Strptime .

use DateTime::Format::Strptime qw( );
my $packed_format = DateTime::Format::Strptime->new(
   pattern  => '%Y%m%d%H%M%S',
   on_error => 'croak',
);
my $iso_format = DateTime::Format::Strptime->new(
   pattern  => '%Y-%m-%d %H:%M:%S',
   on_error => 'croak',
);

# Packed -> ISO
my $iso_date = $iso_format->format_datetime(
   $packed_format->parse_datetime($packed_date)
);

# ISO -> Packed
my $packed_date = $packed_format->format_datetime(
   $iso_format->parse_datetime($iso_date)
);
0 голосов
/ 09 февраля 2012

без регулярных выражений, вы можете просто использовать substr, чтобы получить нужные символы:

$year  = substr $d, 0, 4;
$month = substr $d, 4, 2;
...
$secs  = substr $d, 12, 2;
...