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

时间:2011-09-20 14:04:34

标签: perl parsing datetime

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

例如,我想解析像October 28, 2011 9:00 PM PDT

这样的字符串

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

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

我应该怎么做?

4 个答案:

答案 0 :(得分:41)

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'。

答案 1 :(得分:30)

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

你无法击败它parse date strings的能力。

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

答案 2 :(得分: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);

答案 3 :(得分:4)

如果您正在寻找常见的日期/时间格式 看看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');