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 $dayn";
$formatted = strftime('%m/%d/%Y',$month,$day,$year);
print "$formattedn";

我正在尝试使用 POSIX(strftime) 以一致的格式格式化日期。我不确定输入格式可能是什么。我正在使用Decode_Date_US提取相关的年、月、日信息。然后,我尝试使用 strftime 以一致的方式格式化日期。我收到以下错误用法:POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) 在 test_dates.pl 行 60

任何帮助将不胜感激。"use Time::P iece"最终将用于对日期进行排序。

谢谢

只需使用 Time::Piecestrptime

#!/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;很好。

而且 - 有一种正确的日期写法。如果您要重新格式化,那么没有歧义的那个是最佳选择。

我最终使用了 DateTime 模块的 strftime 函数,它可以处理早于 1970 年的日期。"崩溃" - 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);

最新更新