我试图使用DateTime::Format::Strptime解析某些日期/时间,但我似乎无法让它解析闰秒的日期/时间(例如,2012-06-30T23:59:60 use )。文档显示,它支持最多60秒的闰秒。我做错了什么?
这是我的密码:
use DateTime;
use DateTime::TimeZone;
use DateTime::Format::Strptime;
my $utc = DateTime::TimeZone->new(name => 'Etc/UTC');
my $ymdhms_parser = DateTime::Format::Strptime->new(pattern => '%F %T',
locale => 'en_US',
time_zone => $utc,
strict => 1,
on_error => 'croak');
my $date = '2012-06-30 23:59:60';
print "date: $date\n";
my $dt = $ymdhms_parser->parse_datetime($date);
print "dt: $dt\n";
print "tz: ",$dt->time_zone,"\n";我得到的输出是:
date: 2012-06-30 23:59:60
Parsed values did not produce a valid date at /path/to/test.pl line 14.版本:
DateTime 1.52
DateTime::LeapSecond 1.52
DateTime::Format::Strptime 1.77发布于 2020-03-24 21:42:06
下列工作按计划进行:
my $dt = DateTime->new(
year => 2012,
month => 6,
day => 30,
hour => 23,
minute => 59,
second => 60,
time_zone => $utc,
);但是,对parse_datetime的调用有效地执行了以下操作:
my $dt = DateTime->new(
year => 2012,
month => 6,
day => 30,
hour => 23,
minute => 59,
second => 60,
time_zone => 'floating',
);
$dt->set_time_zone($utc);以上结果在DateTime->new中抛出异常,这将导致接收到的错误消息。
但我不能错误的日期时间::格式::Strptime。
在被解析的字符串中找到的时区(例如,如果使用%z )被传递给->new,传递给构造函数的时区被传递给->set_time zone。这允许在两处指定时区时进行时区转换。
例如,假设输入是2020-03-25T00:00:00-05:00 (注意偏移量)。并假设您向构造函数传递了一个time_zone => 'UTC'和一个适当的模式。得到的DateTime对象将为UTC凌晨5点,而不是午夜UTC-05:00。这很好。
有趣的是,可以使用带有DateTime的浮动时区几秒钟来创建60对象。
$ perl -MDateTime -e'
CORE::say
DateTime
->new(
year => 2012,
month => 6,
day => 30,
hour => 23,
minute => 59,
second => 60,
time_zone => "UTC",
)
->set_time_zone("floating");
'
2012-06-30T23:59:60但是DateTime对于允许这样做是不一致的。
$ perl -MDateTime -e'
CORE::say
DateTime
->new(
year => 2012,
month => 6,
day => 30,
hour => 23,
minute => 59,
second => 60,
time_zone => "floating",
);
'
Invalid second value (60)
at -e line 1.作为解决办法,将时区包括在正在分析的数据中。
my $ymdhms_parser = DateTime::Format::Strptime->new(
pattern => '%F %T%z',
locale => 'en_US',
strict => 1,
on_error => 'croak',
);
my $dt = $ymdhms_parser->parse_datetime($date.'Z');https://stackoverflow.com/questions/60836745
复制相似问题