web-dev-qa-db-ja.com

Perlで文字列を解析してDateTimeオブジェクトにする方法は?

DateTime Perlモジュール、および多くの DateTime::Format:: 特定の種類の日付/時刻形式を解析するモジュール。しかし、日付/時刻文字列のいくつかの例を考えると、どの特定のモジュールを使用する必要がありますか(コーディング/設計時、not実行時) ?

たとえば、次のような文字列を解析したい:October 28, 2011 9:00 PM PDT

これを調べて、どちらが最も適切なモジュールであるかを見つけることができる最も一般的な日付/時刻形式のリストはありますか?

また、実行時に指定された各文字列の形式を「推測」し、最善を尽くすモジュールをいくつか知っています。ただし、機密性の高いアプリケーションの場合、アプリケーションを設計するときに最初に(可能な限り厳密に)形式を決定し、次に文字列が指定された形式に一致しない場合に警告するモジュールを使用します。

これについてどうすればいいですか?

31
Juan A. Navarro

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」を参照してください。

42
Dave Cross

Time :: Piece を使用する傾向があるのは、単にバージョン 5.1 以降の標準Perlモジュールセットの一部だからです。

日付文字列の解析 の機能に勝るものはありません。

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

_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);
_
13
ErikR

一般的な日付/時刻形式を探している場合は、 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');
4
key_