2011-09-20 65 views
27

我知道DateTime Perl模块,和许多DateTime::Format::模块来解析特定种类的日期/时间格式。然而,给出一些日期/时间字符串的例子,我怎么能找出(在编码/设计时,在运行时而不是)我应该使用哪个特定的模块?如何在Perl中将字符串解析为DateTime对象?

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

是否有一个清单某处的最常见的日期/时间格式,我可以看看这件事,发现这将是最合适的模块?

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

我应该怎么办?

回答

36

DateTime::Format::Strptime需要的日期/时间的字符串和它们解析成日期时间对象。

#!/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'。

+0

谢谢!这就是为什么最终结束了。尽管如此,我还是希望看到一些常用的或标准的日期格式(ISO,RFC),以检查我的某些特定字符串是否适合其中的任何字符串。 –

+0

在http://datetime.perl处有(过期的)DateTime模块列表(其中包含许多DT :: Format模块)。org/wiki/datetime/page/Modules –

+0

不需要很精确地指定格式 – MikeKulls

14

看看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); 
+1

谢谢,但这个解析日期正是*不*我想要做的。我不希望函数猜测字符串的格式;我希望能够指定代码应该准确预期的格式。 –

+0

不错,这正是我想要做的:-)我会推荐一种格式,但如果有人改变它,那么这将是最好的努力。 – MikeKulls

+0

其实这个模块看起来不太好。它解决2015年4月15日至1429060633,但15/apr/2015年至1429020000.很难想象它甚至在这里做什么,因为这是11.28小时差异解析日期。应该没有时间组件。 – MikeKulls

27

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

你不能打败它的能力parse date strings。 看看DateTime::Locale

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

The following methods return strings appropriate for the DateTime->format_cldr() method:

$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() 

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

不幸的是,它不是5.8版本中标准Perl模块的一部分(它仍然是您可以运行的最高版本RHEL 5.x)。但它在5.14。 –

+1

“,它仍然是您可以在RHEL 5.x上运行的最高版本”。这是不正确的。的确,RHEL 5.x以Perl 5.8.8为标准。但是没有什么能够阻止你构建更新的版本。 –

+2

@DaveCross Chirs制作了一定的观点。在RPM之外安装Perl的更新版本并不总是可能的。 RHEL机器通常在企业生产环境中(否则,您将运行Fedora或Centos)。这些系统通常没有完整的_developer工具集,例如安装了C编译器,您可能无法访问它们以安装工具,即使可以,运行生产环境的人也可能会看起来像在生产环境中安装非官方版本的Perl的人。 –

4

如果您正在寻找共同的日期/时间格式,您可以用​​模块

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'); 
相关问题