首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得DateTime::Format::Strptime来解析闰秒的日期/时间?

如何获得DateTime::Format::Strptime来解析闰秒的日期/时间?
EN

Stack Overflow用户
提问于 2020-03-24 17:59:58
回答 1查看 217关注 0票数 4

我试图使用DateTime::Format::Strptime解析某些日期/时间,但我似乎无法让它解析闰秒的日期/时间(例如,2012-06-30T23:59:60 use )。文档显示,它支持最多60秒的闰秒。我做错了什么?

这是我的密码:

代码语言:javascript
复制
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";

我得到的输出是:

代码语言:javascript
复制
date: 2012-06-30 23:59:60
Parsed values did not produce a valid date at /path/to/test.pl line 14.

版本:

代码语言:javascript
复制
DateTime 1.52
DateTime::LeapSecond 1.52
DateTime::Format::Strptime 1.77
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-24 21:42:06

下列工作按计划进行:

代码语言:javascript
复制
my $dt = DateTime->new(
   year      => 2012,
   month     =>    6,
   day       =>   30,
   hour      =>   23,
   minute    =>   59,
   second    =>   60,
   time_zone => $utc,
);

但是,对parse_datetime的调用有效地执行了以下操作:

代码语言:javascript
复制
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对象。

代码语言:javascript
复制
$ 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对于允许这样做是不一致的。

代码语言:javascript
复制
$ 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.

臭虫罚单。

作为解决办法,将时区包括在正在分析的数据中。

代码语言:javascript
复制
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');
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60836745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档