2017-07-17 3 views
0

最終的な目的は、現在の日付と時刻をISO8601形式のTVMaze APIによって返されたものと比較して、新しいテレビ番組が放映されているかどうかを判断することです。ISO8601に準拠した文字列をperlのDateTimeオブジェクトに解析するには?

use strict; 
use warnings; 
use feature 'say'; 
use DateTime; 
my $curmytime = DateTime->now()->format_cldr("yyyy-MM-dd'T'HH:mm:ssZ"); 
# Output is: Time now in UTC:2017-07-17T10:44:52+0000 
say "Time now in UTC:". $curmytime; 
my $strtobeparsed = '2017-04-09T21:00:00-0400'; 
# Next, parse the string "2017-04-09T21:00:00-0400" to a DateTime object 

文字列をDateTimeオブジェクトに解析するにはどうすればよいですか?

+0

のようにそれを使用することができます。 https://metacpan.org/pod/distribution/DateTime-Format-ISO8601/lib/DateTime/Format/ISO8601.pod#5.4.1を参照してください。最も簡単な方法は、独自のパーサをロールすることです。 – simbabque

+0

日付と時刻を*拡張*形式(ハイフンとコロン区切り記号付き)ではなく、*基本*形式のタイムゾーンにすることは非常に奇妙です。 '-04:00'ではないはずですか? – Borodin

+0

@Borodin、はい、 'format_cldr(" yyyy-MM-dd'T'HH:mm:ssZ ")'はコロンなしで返します。両方を比較するには、API文字列からコロンを削除する必要がありました。 – Droidzone

答えて

2

DateTime does not parse dates and times。そのためには、DateTime :: Format :: namespaceの多くのモジュールの1つを使用する必要があります。利用可能なものがない場合は、単にDateTime::Format::Strptimeを使用することができます。それにpatternを与え、それに文字列を渡すと、あなたのためにDateTimeオブジェクトが作成されます。

use DateTime::Format::Strptime; 
my $format = DateTime::Format::Strptime->new(pattern => '%FT%T%z'); 
my $dt = $format->parse_datetime('2017-04-09T21:00:00-0400'); 

次に、別のDateTimeと比較できます。

print "ok" if $dt < DateTime->now; 

あなたは、独自のクラスにそれを回すしたい場合は、それはあまりにも些細なのです。

package DateTime::Format::TVMaze; 
use strict; 
use warnings; 
use DateTime; 
use parent 'DateTime::Format::Strptime'; 

sub new { 
    my $class = shift; 
    my %params = @_; 

    $params{pattern} = '%FT%T%z'; 

    return $class->SUPER::new(%params); 
} 

今、あなたはフォーマットが日時のデフォルト::フォーマット:: ISO8601に含まれていないようです、この

my $dt = DateTime::Format::TVMaze->new->parse_datetime('2017-04-09T21:00:00-0400'); 
+1

ありがとうございます。モジュールPODは、日付を比較できるようにするには、最初にUTCに変換する必要があることを示唆しているようです。 – Droidzone

+0

@Droidzoneこれはかなり可能性があります。 – simbabque

+0

@ikegamiはい。その場合、DateTime :: Format :: ISO8601は既に用意されていますが、欠落しているコロンが問題です。ボロディンはその質問に対するコメントでそれを述べました。 – simbabque

関連する問題