この関数の使用:
perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";'
エポックタイムを返しますが、GMT のみです。結果を GMT+1 (システムのローカルタイム (TZ)) にしたい場合、何を変更する必要がありますか?
前もって感謝します、
アンダース
use DateTime;
my $dt = DateTime->now;
$dt->set_time_zone( 'Europe/Madrid' );
UTCに基づくエポックタイムの標準定義は1つだけであり、タイムゾーンごとに異なるエポックタイムはありません。
gmtimeとlocaltimeの間のオフセットを見つけたい場合は、
use Time::Local;
@t = localtime(time);
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t);
Time :: Localは妥当なソリューションですが、より最新のDateTimeオブジェクト指向モジュールを使用する方がよい場合があります。次に例を示します。
use strict;
use DateTime;
my $dt = DateTime->now;
print $dt->epoch, "\n";
タイムゾーンには、DateTime::TimeZoneモジュールを使用できます。
use strict;
use DateTime;
use DateTime::TimeZone;
my $dt = DateTime->now;
my $tz = DateTime::TimeZone->new(name => "local");
$dt->add(seconds => $tz->offset_for_datetime($dt));
print $dt->epoch, "\n";
CPANリンク:
タイムゾーンを設定するだけです。試す:
env TZ = UTC + 1 perl -e'use Time :: Local; print timelocal( "00"、 "00"、 "00"、 "01"、 "01"、 "2000")、 "\ n"; '
Time::Local::timelocal
の逆ですlocaltime
。結果はホストの現地時間になります。
$ perl -MTime::Local -le \ 'print scalar localtime timelocal "00","00","00","01","01","2000"' 火曜日 2 月 1 日 00:00:00 2000
gmtime
それに対応するが欲しいlocaltime
ですか?
$ perl -MTime::Local' -le \ 'print scalar gmtime timelocal "00","00","00","01","01","2000"' 2000 年 1 月 31 日月曜日 23:00:00
localtime
それに対応する を逆にしたいgmtime
ですか?
$ perl -MTime::Local -le \ 'print scalar localtime timegm "00","00","00","01","01","2000"' 火曜日 2 月 1 日 01:00:00 2000
DateTime::Format::Strptimeに基づく別の例
use strict;
use warnings;
use v5.10;
use DateTime::Format::Strptime;
my $s = "2016-12-22T06:16:29.798Z";
my $p = DateTime::Format::Strptime->new(
pattern => "%Y-%m-%dT%T.%NZ",
time_zone => "UTC"
);
my $dt = $p->parse_datetime($s);
$dt->set_time_zone("Europe/Berlin");
say join ' ', $dt->ymd, $dt->hms; # shows 2016-12-22 07:16:29
時間の値をあるタイムゾーンから別のタイムゾーンに変更する場合は、両方のタイムゾーンを指定できる必要があります。
結局のところ、GMT、米国/東部時間、またはベネズエラ時間に変換するかどうかを設定する場合、つまり、時間または時間と分の量を加算/減算することを意味する場合、どのタイムゾーンが開始タイム"12:30"
ゾーンであるかを知る必要があります。計算では、加算または減算する量がわかりません。
を使用する場合DateTime->now;
、タイムゾーンはデフォルトでシステム時間に設定されますが、これは変換元のタイムゾーンではない可能性があります。
以下のコードでは、datetime オブジェクトを正しい開始タイムゾーン ( fromtimezone
) に初期化する方法と、その時間を終了タイムゾーン ( totimezone
) に変換する方法を示しています...
DateTime
CPAN モジュールがインストールされた Perl サンドボックスをオンラインで見つけることができませんでした。
use strict;
use DateTime;
sub convertTimeZonesForTime {
my ($args) = @_;
my $time = $args->{time};
my $date = $args->{date};
my $totimezone = $args->{totimezone};
my $fromtimezone = $args->{fromtimezone};
my $format = $args->{format} || '%H:%M:%S';
my ($year, $month, $day) = map {int $_} split('-', $date);
my ($hour, $minute, $second) = map {int $_} split(':', $time);
$year ||= 1999 if !defined $year;
$month ||= 1 if !defined $month;
$day ||= 1 if !defined $day;
$hour ||= 12 if !defined $hour;
$minute ||= 30 if !defined $minute;
$second ||= 0 if !defined $second;
my $dt = DateTime->new(
year=>$year,
month=>$month,
day=>$day,
hour=>$hour,
minute=>$minute,
second=>$second,
time_zone => $fromtimezone,
);
my $formatter = new DateTime::Format::Strptime(pattern => $format);
$dt->set_formatter($formatter);
$dt->set_time_zone($totimezone);
return "$dt";
}
print(convertTimeZonesForTime({
'totimezone'=>'America/Denver',
'fromtimezone'=>'US/Eastern',
'time'=>'12:30:00',
}));
出力:
10:30:00