Perlで日付を解析してタイムゾーンを変換するにはどうすればよいですか?
質問
Perlの localtime 関数を使用して現在の日付と時刻を取得しましたただし、既存の日付で解析する必要があります。次の形式でGMT日付があります:" 20090103 12:00"これを解析して、作業可能な日付オブジェクトに変換し、GMTの時刻/日付を現在の東部標準時である現在のタイムゾーンに変換したいと思います。そこで、「20090103 12:00」に変換したいと思います。 「20090103 7:00」へこれを行う方法に関する情報は大歓迎です。
解決
Perlに組み込まれた日付処理インターフェイスは一種の不格好なものであり、6個ほどの変数を渡すことになります。より良い方法は、 DateTime または Time :: Piece 。 DateTimeはすべてを歌う、すべてを踊るPerlの日付オブジェクトであり、おそらく最終的には使用したいと思うでしょうが、Time :: Pieceはこのタスクにシンプルで完全に適切であり、5.10で出荷できるという利点があり、基本的には両方で同じです。
Time :: Pieceと strptime を使用したシンプルで柔軟な方法です。 。
#!/usr/bin/perl
use 5.10.0;
use strict;
use warnings;
use Time::Piece;
# Read the date from the command line.
my $date = shift;
# Parse the date using strptime(), which uses strftime() formats.
my $time = Time::Piece->strptime($date, "%Y%m%d %H:%M");
# Here it is, parsed but still in GMT.
say $time->datetime;
# Create a localtime object for the same timestamp.
$time = localtime($time->epoch);
# And here it is localized.
say $time->datetime;
これは、対照的な手作業です。
形式が修正されているため、正規表現は問題なく機能しますが、形式が変更された場合は、正規表現を微調整する必要があります。
my($year, $mon, $day, $hour, $min) =
$date =~ /^(\d{4}) (\d{2}) (\d{2})\ (\d{2}):(\d{2})$/x;
それをUnixエポック時間(1970年1月1日からの秒数)に変換します
use Time::Local;
# Note that all the internal Perl date handling functions take month
# from 0 and the year starting at 1900. Blame C (or blame Larry for
# parroting C).
my $time = timegm(0, $min, $hour, $day, $mon - 1, $year - 1900);
そして現地時間に戻ります。
(undef, $min, $hour, $day, $mon, $year) = localtime($time);
my $local_date = sprintf "%d%02d%02d %02d:%02d\n",
$year + 1900, $mon + 1, $day, $hour, $min;
他のヒント
DateTime とその strptime 形式モジュール。
use DateTime;
use DateTime::Format::Strptime;
my $val = "20090103 12:00";
my $format = new DateTime::Format::Strptime(
pattern => '%Y%m%d %H:%M',
time_zone => 'GMT',
);
my $date = $format->parse_datetime($val);
print $date->strftime("%Y%m%d %H:%M %Z")."\n";
$date->set_time_zone("America/New_York"); # or "local"
print $date->strftime("%Y%m%d %H:%M %Z")."\n";
$ perl dates.pl
20090103 12:00 UTC
20090103 07:00 EST
現地時間を解析したい場合は、次のようにします:)
use DateTime;
my @time = (localtime);
my $date = DateTime->new(year => $time[5]+1900, month => $time[4]+1,
day => $time[3], hour => $time[2], minute => $time[1],
second => $time[0], time_zone => "America/New_York");
print $date->strftime("%F %r %Z")."\n";
$date->set_time_zone("Europe/Prague");
print $date->strftime("%F %r %Z")."\n";
それが私がすることです...
#!/usr/bin/perl
use Date::Parse;
use POSIX;
$orig = "20090103 12:00";
print strftime("%Y%m%d %R", localtime(str2time($orig, 'GMT')));
Date :: Parse
および str2time()<の代わりに
Time :: ParseDate
および parsedate()
を使用することもできます/ code>。事実上の標準ATMであることに注意してください。 DateTimeのようです(ただし、タイムスタンプを変換するためだけにOO構文を使用したくない場合があります)。
選択してください:
- DateTime :: *(または、 datetime.perl.org )
- Date :: Manip
- Date :: Calc (2004年の最終更新)
他にも数十億人がいることは間違いありませんが、おそらく彼らはトップ候補です。
use strict;
use warnings;
my ($sec,$min,$hour,$day,$month,$year)=localtime();
$year+=1900;
$month+=1;
$today_time = sprintf("%02d-%02d-%04d %02d:%02d:%02d",$day,$month,$year,$hour,$min,$sec);
print $today_time;