如何显示4/25/10到2010-25-04?

时间:2013-12-20 08:14:54

标签: perl split printf

my$str= '4/25/10';
my$sr = join(' ',split (/\//,$str));
#my$s = sprintf '%3$d %2$d %1$d',$srt;
print$sr,"\n";

输出:

4 25 10

但我希望输出像2010-25-04。任何人都可以建议我如何显示我的欲望输出。给我你的建议 你的答案会很明显。

4 个答案:

答案 0 :(得分:2)

嗯,脑死亡解决方案可能是:

my @date = split( /\//,$str)
printf("%04d-%02d-%02d", $date[2] + 2000, $date[1], $date[0]);

您可以通过突出显示您希望年,月和日的内容来编写更多自我记录的内容,如下所示:

my ($day, $month, $year) = split /\//, $str;
printf("%04d-%02d-%02d", $year + 2000, $month, $day);

答案 1 :(得分:2)

你不是那么遥远。

您可以保留单个变量以更好地处理数据,而不是在单个操作中拆分和连接:

my ($d,$m,$y) = split /\//, $str;

然后您可以以任何方式对其进行格式化,例如:

printf "20%02d-%02d-%02d\n", $y, $d, $m;

但有几点说明:

  • 我不会对源格式发表评论,但是你要转换的格式没有多大意义。你可能会更好地使用ISO-8601:2010-04-25。
  • 显然,这种做法只适用于2099年。
  • 对于任何更严重的事情,你最好将这种工作委托给日期处理模块。例如,请参阅this question for parsingthis question for formatting

答案 2 :(得分:1)

use DateTime::Format::Strptime;
my $strp = DateTime::Format::Strptime->new(
    pattern   => '%m/%d/%y',
    locale    => 'en_US'
);
my $dt = $strp->parse_datetime('4/25/10');
print $dt->strftime('%Y-%d-%m'), "\n";

给出:

2010-25-04

答案 3 :(得分:1)

无需为此DateTime做。多年来,Time::Piece已包含在Perl核心发行版中。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Time::Piece;

my $date = '4/25/10';

my $date_tp = Time::Piece->strptime($date, '%m/%d/%y');

say $date_tp->strftime('%Y-%m-%d');