自英国夏令时上周在英国结束以来,我的应用程序一直在看到一个非常有趣的bug。下面是一个孤立的Perl脚本,这表明该问题:为什么DateTime :: Format :: W3CDTF在英国夏令时之外的欧洲/伦敦日期返回0?
#!/usr/bin/perl
use strict; use warnings;
use DateTime::Format::W3CDTF;
use DateTime::Format::ISO8601;
my $tz = 'Europe/London';
sub print_formatted_date {
my $date = shift;
my $tz_date = DateTime::Format::ISO8601->new->parse_datetime($date);
$tz_date->set_time_zone($tz);
print "tz_date: $tz_date\n";
$tz_date->set_formatter(DateTime::Format::W3CDTF->new);
print "tz_date with W3C formatter: $tz_date\n";
}
print_formatted_date('2009-10-25');
print "\n";
print_formatted_date('2009-10-26');
的这个输出是:
tz_date: 2009-10-25T00:00:00
tz_date with W3C formatter: 2009-10-25T00:00:00+01:00
tz_date: 2009-10-26T00:00:00
tz_date with W3C formatter: 0
注意,对于落在BST以外日期的W3C格式是使它们为“0”。
这对我来说是个问题,因为我们使用的第三方库在SOAP调用期间使用DateTime :: Format :: W3CDTF格式化参数。由于格式化失败,呼叫失败。
任何人都有任何线索?我不是Perl大师,所以任何帮助都会非常感激。这可能是DateTime :: Format :: W3CDTF库中的一个错误吗?
一个perl子的返回值修复程序是最后一个表达式的计算的值,在这种情况下是'$ offset'(从'如果(我的$ offset = $ dt-> offset())')或者'0'。 – Ether 2009-10-30 02:33:35