27

Perl でlocaltime関数を使用して現在の日付と時刻を取得しましたが、既存の日付を解析する必要があります。次の形式の GMT 日付があります: "20090103 12:00" 処理できる日付オブジェクトに解析し、GMT 時刻/日付を現在のタイム ゾーン (現在は東部標準時) に変換したいと考えています。 . したがって、「20090103 12:00」を「20090103 7:00」に変換したいと思います。これを行う方法に関する情報は大歓迎です。

4

5 に答える 5

48

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;
于 2009-01-04T22:19:58.397 に答える
21

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";
于 2009-01-04T22:20:26.193 に答える
6

それは私がすることです...

#!/usr/bin/perl
use Date::Parse;
use POSIX;

$orig = "20090103 12:00";

print strftime("%Y%m%d %R", localtime(str2time($orig, 'GMT')));

Time::ParseDateandparsedate()の代わりにDate::Parseandを使用することもできますstr2time()。デファクトスタンダードのatmに注意してください。DateTimeのようです(ただし、タイムスタンプを変換するためだけにOO構文を使用したくない場合があります)。

于 2009-01-05T10:11:09.163 に答える
4

好きなのを選びな:

他にも無数にあることは間違いありませんが、おそらく彼らが最有力候補です。

于 2009-01-04T22:18:46.620 に答える