%-d标志,说明符不起作用

时间:2014-05-15 05:46:34

标签: perl strftime

我的平台是Linux。我希望在给定输入(例如Apr 3, 2014, 5:28 PM

)时将打印日期格式化为2014-04-03T17:28:54.864Z

我目前的Perl脚本。

#!/usr/bin/perl

use lib '/tmp/DateTime/Format';
use DateTime::Format::ISO8601;
my $date = "2014-04-03T17:28:54.864Z";
my $iso8601 = DateTime::Format::ISO8601 -> new;
my $dt = $iso8601->parse_datetime( $date );
print "Date before conversion *******-> \"$date\"\n";

my $s6 = $dt->strftime("%b %-d, %Y, %I:%M %p");
print "Date after conversion *******-> \"$s6\"\n";

它给出输出Apr %-d, 2014, 05:28 PM。当月或小时的日期是单个数字时,我不希望零或空格填充。当日期和小时都是一位数时,我希望输出为Apr 3, 2014, 5:28 PM

3 个答案:

答案 0 :(得分:0)

我看到valid strftime patterns中没有列出%-d选项。

您可以使用%e来获得领先的空间而不是前导零,但是,由于您对此进行了折扣,您可以单独获取该日期,然后更改它并在格式字符串中使用该更改的值,例如(未经测试,但你会得到这个想法):

# Get day and remove leading zero.

my $dayofmonth = $dt->strftime("%d");
$dayofmonth =~ s/^0//;

# Construct format string from "hard-coded" day.

my $s6 = $dt->strftime("%b " . $dayofmonth . ", %Y, %I:%M %p");

答案 1 :(得分:0)

试试这个:

my $s6 = $dt->format_cldr('MMM d, Y, h:mm a');

它使用了模块:

DateTime :: Format :: CLDR - 解析和格式化CLDR时间模式

您可以找到有记录的here

答案 2 :(得分:0)

由于%d%e以外的日期没有任何strftime模式,因此简单的解决方案就是在事后编辑结果

$s6 =~ s/\s+/ /g;

这会将您的脚本更改为以下内容:

use strict;
use warnings;

use DateTime::Format::ISO8601;

my $date = "2014-04-03T17:28:54.864Z";
my $iso8601 = DateTime::Format::ISO8601->new;
my $dt = $iso8601->parse_datetime( $date );
print qq{Date before conversion *******-> "$date"\n};

my $s6 = $dt->strftime("%b %e, %Y, %I:%M %p");
$s6 =~ s/\s+/ /g;
print qq{Date after conversion *******-> "$s6"\n};