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

42fyovps  于 2022-11-15  发布在  Perl
关注(0)|答案(5)|浏览(149)

我知道Perl的DateTime模块,以及许多解析特定类型的日期/时间格式的DateTime::Format::模块。但是,给定一些日期/时间字符串的示例,我如何才能确定(在编码/设计时,* 而不是 * 在运行时)我应该使用哪个特定的模块?
例如,我想解析如下字符串:October 28, 2011 9:00 PM PDT
是否有一个最常见的日期/时间格式的列表,我可以在其中查找并找到最合适的模块?
我也知道有些模块会在运行时尽力“猜测”每个给定字符串的格式。但是,对于敏感的应用程序,我希望在设计应用程序时首先(尽可能严格地)确定格式,然后使用一个模块,如果字符串与指定的格式不匹配,该模块会向我发出警告。
我该怎么做?

5cnsuln7

5cnsuln71#

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";

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

dxxyhpgq

dxxyhpgq2#

我倾向于使用Time::Piece,因为它是从5.10版本开始的标准Perl模块集的一部分。
你不能击败它的能力,解析日期字符串。

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

ykejflvf3#

看一下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);
ghhaqwfi

ghhaqwfi4#

如果您正在寻找常见的日期/时间格式,请查看DateTime::Locale

use DateTime::Locale
my $locale = DateTime::Locale->load('DE_de');

下面的方法返回适合DateTime-〉format_cldr()方法的字符串:

$locale->date_format_full()
$locale->date_format_long()
$locale->date_format_medium()
$locale->date_format_short()
$locale->date_format_default()
$locale->time_format_full()
$locale->time_format_long()
$locale->time_format_medium()
$locale->time_format_short()
$locale->time_format_default()
$locale->datetime_format_full()
$locale->datetime_format_long()
$locale->datetime_format_medium()
$locale->datetime_format_short()
$locale->datetime_format_default()

可以使用DateTime::Format::CLDR模块解析日期

use DateTime::Format::CLDR;
# 1. Basic example
my $cldr = DateTime::Format::CLDR->new(
    pattern     => 'dd.MM.yyyy HH:mm:ss',
    locale      => 'de_DE',
    time_zone   => 'Europe/Berlin',
);
my $dt = $cldr->parse_datetime('26.06.2013 11:05:28');
jv4diomz

jv4diomz5#

DateTime::Format::Natural也是一个很好的候选。
测试项目:

perl -MDateTime::Format::Natural \
-E "my $d=DateTime::Format::Natural->new->parse_datetime('October 11, 2021'); say $d->month;"

10

相关问题