Perl中以MM/DD/YYYY格式表示的今天日期

53

我正在工作中编写Perl程序,并卡在(我认为是)一个微不足道的问题上。我只需要按照格式“06/13/2012”来构建一个字符串(始终为10个字符,因此对于小于10的数字需要添加0)。

目前我的代码如下:

use Time::localtime;
$tm=localtime;
my ($day,$month,$year)=($tm->mday,$tm->month,$tm->year);

12
如果你有发言权,请考虑使用明确且可排序的ISO 8601格式YYYY-MM-DD,而不是MM/DD/YYYY - Keith Thompson
7个回答

67
你可以使用一个POSIX函数快速完成它。如果你有很多带有日期的任务,请查看DateTime模块。
use POSIX qw(strftime);

my $date = strftime "%m/%d/%Y", localtime;
print $date;

6
POSIX和DateTime都是非常庞大的代码库,对于这么简单的任务来说有些过度。 - Borodin
有没有更好的方法将2017-04-29更改为04/29/2017? - Shicheng Guo

61
你可以使用 Time::Piece,这是一个核心模块,自Perl 5版本10以来一直随附于Perl发行版中,无需额外安装。
use Time::Piece;

my $date = localtime->strftime('%m/%d/%Y');
print $date;

输出

06/13/2012


更新

您可能更喜欢使用dmy方法,它只需要一个参数,该参数是结果字段之间要使用的分隔符,并且避免了指定完整的日期/时间格式。

my $date = localtime->dmy('/');

这会产生与我原来的解决方案完全相同的结果


2
@lepe:有三个实用的“日期”函数,dmymdyymd,其中dateymd的别名。默认情况下,所有这些函数都使用标准的连字符分隔符生成日期,并且可以传递替代分隔符。因此,localtime->ymd生成的是2015-09-28,而不是您所说的20150928。这就是这些方法的一个大弱点——它们本身并没有描述它们所做的事情,这就是为什么我选择了strftime('%m/%d/%Y')的原因。 - Borodin
1
我的服务器上的标准Perl(v5.10.1)没有这个库...只能使用POSIX了,抱歉。 - Orabîg
@BramVanroy:那么你的perl安装是非标准的。Time::Piece首次被纳入“实验性”版本9.5中,并从未被删除,之后的第一个稳定版本将是10.0,因此如果你有一个没有Time::Piece的版本10.1,则说明有人已经将其从安装中明确删除了。无论如何,CPAN库是Perl最大的优势之一,仅限于核心模块是愚蠢的。 - Borodin
这是运行在CentOS上的 Perl,版本为 v5.10.1 (*),编译时针对 x86_64-linux-thread-multi 架构进行优化。但我们的系统管理员可能对其进行了一些调整,我无法验证。 - Bram Vanroy
如果您从www.cpan.org/src/下载并解压perl-5.10.1.tar.gz,您会发现Time::Pieceperl-5.10.1\ext\Time-Piece的子文件夹中。如果您的系统管理员选择从头开始构建perl,则只需回答“none”而不是选择默认值来回答“您希望包括哪些扩展名?”这个问题,那么您将获得一个没有大多数核心模块的安装。 - Borodin
如果您需要没有零填充的日期,请使用此格式:%-m/%-d/%Y(请注意**%后面的-**),如POSIX文档中所述。 - lepe

18
use DateTime qw();
DateTime->now->strftime('%m/%d/%Y')   

表达式返回06/13/2012


8

如果你喜欢走弯路:

my (undef,undef,undef,$mday,$mon,$year) = localtime;
$year = $year+1900;
$mon += 1;
if (length($mon)  == 1) {$mon = "0$mon";}
if (length($mday) == 1) {$mday = "0$mday";}
my $today = "$mon/$mday/$year";

3
自从Time::Piece已经成为核心模块以来,使用困难的方法已经不再必要。 - daxim
3
Time::Piece 出现在 5.9.5 的核心中。 - JRFerguson
3
全球有很多正在使用2006年版Perl 5.8的生产网站。 perldoc perlhist | perl -ne 'die "$_\n" if m/5.9.5.*20[01].{8}/'指出,5.9.5版本是在2007年7月7日发布的。 - MarkHu

4
use Time::Piece;
...
my $t = localtime;
print $t->mdy("/");# 02/29/2000

1
这似乎是一个更方便的用例示例。不幸的是,我无法评论Borodin先生的回复。 - dezhik

4

Unix系统中的Perl代码:

# Capture date from shell
my $current_date = `date +"%m/%d/%Y"`;

# Remove newline character
$current_date = substr($current_date,0,-1);

print $current_date, "\n";

4
chomp函数也可以用于去除换行符:chomp $current_date - Christopher Bottoms
1
这个问题明确要求使用 MM/DD/YYYY 格式。我个人更喜欢 ISO 8601 的 YYYY-MM-DD 格式,但这并不能正确回答这个问题。 - Keith Thompson
@KeithThompson 谢谢。已修复。 - Christopher Bottoms

2
使用perl中的内置函数"sprintf"可以轻松地格式化带前导零的数字(有关详细信息请参见:perldoc perlfunc)。请注意保留HTML标记。
use strict;
use warnings;
use Date::Calc qw();
my ($y, $m, $d) = Date::Calc::Today();
my $ddmmyyyy = sprintf '%02d.%02d.%d', $d, $m, $y;
print $ddmmyyyy . "\n";

这会给你带来:

2014年5月14日


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接