格式化日期的简单方法

时间:2012-02-29 11:09:17

标签: perl datetime

我写了一个perl脚本来获取datetime。 它确实有效,但我想知道是否有更简单的方法将日期格式化为输出。

#!/usr/bin/perl
use DateTime;

my $dt          = DateTime->now( time_zone => 'local' );
$myTimeStamp    = $dt->subtract( days => 1 );
$myYear         = $myTimeStamp->year;
$myMonth        = $myTimeStamp->month;
if ( length( $myMonth ) == 1 ) {
    $myMonth = "0$myMonth";
}
$myDay          = $myTimeStamp->day;
if ( length( $myDay ) == 1 ) {
    $myDay = "0$myDay";
}
$myHour         = $myTimeStamp->hour;
if ( length( $myHour ) == 1 ) {
    $myHour = "0$myHour";
}
#$myDir          = "/var/tmp/logs/$myYear/$myMonth/$myYear$myMonth-";

print "--> $myYear $myMonth $myDay $myHour\n";
# --> 2012 02 28 02
exit 0;

4 个答案:

答案 0 :(得分:9)

DateTime为此提供format_cldr方法:

use DateTime;

my $myTimeStamp = DateTime->now->subtract( days => 1 );

printf "--> %s\n", $myTimeStamp->format_cldr('yyyy MM dd HH');
# --> 2012 02 28 02

答案 1 :(得分:7)

当然,请使用POSIX模块:

  

POSIX模块允许您访问所有(或几乎所有)   标准POSIX 1003.1标识符。

示例:

use POSIX;
print POSIX::strftime('%d-%m-%Y %H:%M:%S', localtime());

答案 2 :(得分:1)

  • 首先始终 use strict;use warnings;在程序开头,并声明所有变量接近第一次使用。这尤其适用于寻求帮助的过程,因为它会发现很多简单的错误,而这些错误并不是很明显。

如果要对任何输出进行零填充,最好使用printf。也不需要提取日期字段来分隔变量。您输出的输出是否是您最终想要的输出?该程序与您发布的代码完全相同。

use strict;
use warnings;

use DateTime;

my $myTimeStamp = DateTime->now->subtract( days => 1 );
printf "--> %04d %02d %02d %02d\n", map $myTimeStamp->$_, qw/year month day hour/;

<强>输出

--> 2012 02 28 12

答案 3 :(得分:1)

如上所述,对于重新格式化日期,有POSIX核心模块。你也不会忽视核心模块Time::Piece,它不仅提供strftime()而且提供strptime()以提供非常灵活的日期/时间解析。 Time::Piece出现在5.9.5的Perl核心中。