Perl преобразования формата даты - PullRequest
3 голосов
/ 02 февраля 2012

Я беру 02/29/2012 из HTML-формы, но с этого момента мне нужно будет работать с ISO 2012-02-29.Я уверен, что мне было бы легче сделать это с Perl, не касаясь JS DatePicker, который я не понимаю.

Ответы [ 8 ]

5 голосов
/ 02 февраля 2012

Чтобы сделать ваше преобразование, просто используйте

s{([0-9]{2})/([0-9]{2})/([0-9]{4})}{$3-$2-$1}

Но AFAIK, ISO это не ГГГГ-ДД-ММ, а ГГГГ-ММ-ДД.

5 голосов
/ 02 февраля 2012
$date = '02/29/2012';
$date =~ s#(\d+)/(\d+)/(\d+)#$3-$1-$2#;
2 голосов
/ 02 февраля 2012

Вы можете использовать DateTime или Date :: Manip . Существует множество подпрограмм, которые выполняют различные манипуляции с датой. Например, используя Date :: Manip:

$string = '02/29/2012';
$date = ParseDate($string);
$out = UnixDate($date, '%Y-%m-%d');

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

1 голос
/ 02 февраля 2012

Использование стандартного Perl:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my $date = '02/09/2012';

say join '-', (split m|/|, $date)[2,1,0];

Использование DateTime:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use DateTime::Format::Strptime;

my $date = '02/09/2012';

my $parser = DateTime::Format::Strptime->new(
               pattern => '%d/%m/%Y',
             );

my $dt = $parser->parse_datetime($date);
say $dt->ymd;

Если вы хотите иметь дело с датами и временем в Perl, то DateTime и его друзья - это те инструменты, которые вам нужны.

1 голос
/ 02 февраля 2012

Вы можете использовать модуль Date :: Manip :: Date .

Это немного дороже, но делает проверку дат.

0 голосов
/ 02 февраля 2012

Поскольку ввод не является доверенным (веб-форма ...), я предлагаю в основном использовать ответ Чоробы (с добавленной проверкой границ), но в тесте, который проверяет, соответствует ли ввод:

# input and result are in $_
unless (s{^([0-9]{2})/([0-9]{2})/([0-9]{4})$}{$3-$2-$1}) {
    die "invalid input";
}
# From here input is both validated and transformed
0 голосов
/ 02 февраля 2012

Функцию strptime также можно использовать из основного модуля, Time :: Piece :

use Time::Piece;
my $date = q(02/29/2012);
my $t    = Time::Piece->strptime( $date, "%m/%d/%Y" );
print $t->ymd, "\n";
0 голосов
/ 02 февраля 2012

Это зависит от того, сколько работы вы собираетесь делать с датами, а также от того, будете ли вы культурно осведомлены о том, как разные люди вводят даты, и будете ли вы принимать названия месяцев или сокращения кака также чистые цифры и ...

В CPAN есть большой раздел по Типы данных , в котором есть подразделы для Дата и Время со многими модулями в каждом.Некоторые из них чрезвычайно сложны: например, модуль DateTime является чрезвычайно тщательным, но довольно тяжелым (и не указан ни в разделе «Дата», ни «Время»).Другие просто умны: Date :: Calc и Date :: Manip .Основная проблема в CPAN - это смущение богатства - вероятно, вам нужно то, что вам нужно.

Если сработают простые регулярные выражения в других ответах, используйте их.В противном случае рассмотрите один из вариантов Date :: Calc или Date :: Manip, если только вы не найдете что-то еще, что будет работать лучше для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...