我知道DateTime
Perl模块,以及许多DateTime::Format::
模块来解析特定类型的日期/时间格式。但是,考虑到日期/时间字符串的一些示例,我如何计算(在编码/设计时,运行时不)我应该使用哪个特定模块?
例如,我想解析像October 28, 2011 9:00 PM PDT
是否有最常见的日期/时间格式的列表,我可以查看这个列表并找到哪个是最合适的模块?
我也知道一些模块试图在运行时“猜测”每个给定字符串的格式并尽力而为。但是,对于敏感应用程序,我想在设计应用程序时首先确定(尽可能严格)格式,然后使用一个模块,如果字符串与指定的格式不匹配,它将发出警告。
我应该怎么做?
答案 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');