Даты формата 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);
Другие вопросы по тегам