2010-02-04 46 views
3

我想采用时间戳(例如1263531246)并将其转换为适合输出到符合xs:dateTime的属性字段中的XML文件的字符串表示形式。 xs:dateTime预计类似:如何在Perl中以xs:dateTime格式打印日期时间?

2002-05-30T09:30:10-06:00

理想情况下,我会使用,其包括从UTC偏移量(如上)的形式输出。在这个项目中,我受限于使用Perl。有什么建议么?

回答

5

这在Linux上工作:

$ perl -MPOSIX -e 'print POSIX::strftime("%Y-%m-%dT%H:%M:%S%z\n", localtime)' 
2010-02-04T17:37:43-0500

在Windows上,与ActiveState的Perl中,它打印:

2010-02-04T17:39:24Eastern Standard Time

使用DateTime

#!/usr/bin/perl 
use strict; use warnings; 

use DateTime; 
my $dt = DateTime->now(time_zone => 'EST'); 
print $dt->strftime('%Y-%m-%dT%H:%M:%S%z'), "\n" 

我得到的Windows正确的字符串以及:

E:\> t 
2010-02-04T18:06:24-0500

我相信Date::Format是重量轻得多模块:

#!/usr/bin/perl 
use strict; use warnings; 

use Date::Format; 
print time2str('%Y-%m-%dT%H:%M:%S%z', time, 'EST'), "\n"; 

输出:

E:\> t 
2010-02-04T18:11:36-0500
7

使用权DateTime格式化模块,你可以无需编写任何 格式的字符串和DateTime对象之间的转换痛苦的正则表达式来解析或使用strftime()进行格式化。

您似乎需要XSD格式(ISO8601的子集,用于XML模式):请参阅DateTime::Format::XSD

use DateTime; 
use DateTime::Format::XSD; 

my $dt = DateTime->now; 
print DateTime::Format::XSD->format_datetime($dt); 

生产:

2010-02-04T23:24:11+00:00 

如果您需要处理大量的DateTime对象,你可以依靠自动格式化和字串缩短你的代码;简单的 '格式化' 参数传递给您的DateTime构造函数:

my $dt = DateTime->new(year => 1999, month => 1, day => 1, 
         formatter => 'DateTime::Format::XSD' 
        ); 

my $xml = "<date>$dt</date>"; # through the magic of overloading, this works! 

结果:

<date>1999-01-01T00:00:00+00:00</date> 

欲了解更多信息,请参阅http://search.cpan.org/dist/DateTime/lib/DateTime.pm#Formatters_And_Stringification