Даты формата Perl
use Date::Calc qw(:all);
use Time::Piece;
use POSIX qw(strftime);
$a1 = '01.01.1963';
($year, $month, $day) = Decode_Date_US($a1);
print "$year $month $day\n";
$formatted = strftime('%m/%d/%Y',$month,$day,$year);
print "$formatted\n";
Я пытаюсь отформатировать даты в согласованном формате, используя POSIX(strftime). Я не уверен, что формат ввода может быть. Я использую Decode_Date_US для извлечения информации о соответствующем году, месяце и дне. Затем я пытаюсь последовательно отформатировать даты, используя strftime. Я получаю следующую ошибку Использование: POSIX::strftime(fmt, сек, мин, час, mday, понедельник, год, wday = -1, yday = -1, isdst = -1) в строке test_dates.pl 60
Любая помощь будет оценена. "use Time::Piece" будет в конечном итоге использоваться для сортировки дат.
Спасибо
2 ответа
Просто используйте Time::Piece
а также strptime
#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;
my $date = '01.01.1963';
my $timestamp = Time::Piece->strptime( $date, "%m.%d.%Y" );
print $timestamp -> strftime( "%m/%d/%Y")
Но если формат несовместим, то вы попадаете в проигрыш - для начала, есть много мест, которые транспонируют порядок дня / месяца или представляют год в виде двух цифр (которые иногда конфликтуют с месяцем или днем).
Это по своей сути неоднозначно. Вы можете - в лучшем случае - применить некоторые очень грубые догадки, набирая группы цифр и предполагая, что они в последовательном порядке.
Например
my ( $day, $month, $year ) = m/(\d{2}).*(\d{2}).*(\d{4})/;
$timestamp = Time::Piece -> strptime ( "$year-$month-$day", "%Y-%m-%d" );
Но вы будете сбиты с толку такими датами, как 10/11/12
потому что вы просто не можете знать, какое число какое поле. Вы можете попробовать угадать, eval
в strptime
и просто повторяйте разные форматы, пока не получите тот, который декодирует во что-то правильное.
Как вы указываете - Decode_Date_US в основном делает это так:
use strict;
use warnings;
use Date::Calc qw(:all);
use Time::Piece;
my $a1 = '01.01.1963';
my ($year, $month, $day) = Decode_Date_US($a1);
my $time = Time::Piece -> strptime("$year/$month/$day", "%Y/%m/%d");
print $time->strftime("%Y-%m-%d"),"\n";
Также - use strict; use warnings;
это хорошо.
И - есть один правильный способ написания дат. Если вы собираетесь переформатировать вообще, то тот, который не является двусмысленным, является лучшим выбором.
Я закончил тем, что использовал функцию strftime модуля DateTime, которая может обрабатывать даты более ранние, чем 1970. "Crashing" - Перестал работать интерпретатор командной строки Perl. Если это поможет, я использую Windows-машину и очень редко использую Perl.
это сработало для меня
use Date::Calc qw(:all);
use DateTime;
$dateformat = "%m/%d/%Y";
($year, $month, $day) = Decode_Date_US($date);
$date = DateTime->new(
year=>$year,
month=>$month,
day=>$day,
);
$date = $date->strftime($dateformat);