如何将字符串解析为Perl中的DateTime对象?

Jua*_*rro 32 perl datetime parsing

我知道DateTimePerl模块,以及许多DateTime::Format::解析特定日期/时间格式的模块.但是,考虑到日期/时间字符串的一些示例,我如何计算(在编码/设计时,而不是在运行时)我应该使用哪个特定模块?

例如,我想解析字符串,如: October 28, 2011 9:00 PM PDT

是否有一个最常见的日期/时间格式的列表,我可以查看它,找到哪个是最合适的模块?

我也知道一些模块试图在运行时"猜测"每个给定字符串的格式并尽力而为.但是,对于敏感应用程序,我想在设计应用程序时首先确定(尽可能严格)格式,然后使用一个模块,如果字符串与指定的格式不匹配,它将发出警告.

我该怎么办呢?

Dav*_*oss 43

DateTime :: Format :: Strptime获取日期/时间字符串并将它们解析为DateTime对象.

#!/usr/bin/perl

use strict;
use warnings;

use DateTime::Format::Strptime;

my $parser = DateTime::Format::Strptime->new(
  pattern => '%B %d, %Y %I:%M %p %Z',
  on_error => 'croak',
);

my $dt = $parser->parse_datetime('October 28, 2011 9:00 PM PDT');

print "$dt\n";
Run Code Online (Sandbox Code Playgroud)

模式中使用的字符序列是POSIX标准.有关详细信息,请参阅'man strftime'.


Dav*_* W. 30

我倾向于使用Time :: Piece,因为它是自5.10版以来标准Perl模块集的一部分.

你无法击败它解析日期字符串的能力.

my $time = Time::Piece->strptime(
      "October 28, 2011 9:00 PM PDT",
      "%B %d, %Y %r %Z");
Run Code Online (Sandbox Code Playgroud)

  • @DaveCross Chirs有一定的观点.并不总是可以在RPM之外安装更新的Perl版本.RHEL机器通常在企业生产环境中(否则,您将运行Fedora或Centos).这些系统通常没有完整的_developer工具集,例如安装在它们上面的C编译器,您可能无法访问它们以便安装工具,即使可以,运行生产环境的人员也可能看起来在生产环境中安装非官方版Perl的人. (2认同)
  • @DavidW:我无法否认这一点。但这距离说您 **不能** 运行任何高于 5.8.8 的版本还有很长的路要走。从技术上讲,没有什么可以阻止你。从政治上来说,很可能是这样。 (2认同)

Eri*_*ikR 13

看看Date::Parse模块,即str2time()功能.它支持大多数常用格式.

例:

use Date::Parse;
use DateTime;

my $str = "Tue, 20 Sep 2011 08:51:08 -0500";
my $epoch = str2time($str);
my $datetime = DateTime->from_epoch(epoch => $epoch);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但这正是“不是”我想做的。我不希望函数猜测字符串的格式;我希望能够精确指定代码所期望的格式。 (2认同)