2014-05-15 44 views
0

我的平台是Linux。当给定输入例如2014-04-03T17:28:54.864Z时,我希望打印日期的格式为Apr 3, 2014, 5:28 PM%-d标志与说明符不起作用

我当前的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

回答

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"); 
+0

我告诉我不希望领先空间的情况下,当天是单个数字(1-9)。我怎样才能得到它?另外,我希望在小时值的情况下也是如此。请您建议 – user3616128

+0

@ user3616128,如果您打算阅读它,那么该句将包含在_second_部分。我现在发布了一些可能有所帮助的示例代码。 – paxdiablo

0

试试这个:

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

它利用模块:

日期时间::对于mat :: CLDR - 解析和格式化CLDR时间模式

您可以在其中找到有关文档here

0

,因为没有任何strftime模式比%d%e其他日子,最简单的办法就是事实

$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};