7

この関数の使用:

perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";'

エポックタイムを返しますが、GMT のみです。結果を GMT+1 (システムのローカルタイム (TZ)) にしたい場合、何を変更する必要がありますか?

前もって感謝します、

アンダース

4

7 に答える 7

9
use DateTime;
my $dt   = DateTime->now;
$dt->set_time_zone( 'Europe/Madrid' );
于 2012-11-27T12:05:51.423 に答える
4

UTCに基づくエポックタイムの標準定義は1つだけであり、タイムゾーンごとに異なるエポックタイムはありません。

gmtimeとlocaltimeの間のオフセットを見つけたい場合は、

use Time::Local;
@t = localtime(time);
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t);
于 2010-02-01T14:20:18.470 に答える
3

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リンク:

日付時刻

于 2010-02-01T16:26:10.647 に答える
2

タイムゾーンを設定するだけです。試す:

env TZ = UTC + 1 perl -e'use Time :: Local; print timelocal( "00"、 "00"、 "00"、 "01"、 "01"、 "2000")、 "\ n"; '
于 2010-02-01T14:13:13.183 に答える
2

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
于 2010-02-01T14:26:00.420 に答える
0

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
于 2016-12-22T11:12:05.063 に答える
0

アルゴリズム

時間の値をあるタイムゾーンから別のタイムゾーンに変更する場合は、両方のタイムゾーンを指定できる必要があります。

結局のところ、GMT、米国/東部時間、またはベネズエラ時間に変換するかどうかを設定する場合、つまり、時間または時間と分の量を加算/減算することを意味する場合、どのタイムゾーンが開始タイム"12:30"ゾーンであるかを知る必要があります。計算では、加算または減算する量がわかりません。

を使用する場合DateTime->now;、タイムゾーンはデフォルトでシステム時間に設定されますが、これは変換元のタイムゾーンではない可能性があります。

以下のコードでは、datetime オブジェクトを正しい開始タイムゾーン ( fromtimezone) に初期化する方法と、その時間を終了タイムゾーン ( totimezone) に変換する方法を示しています...

作業コード

DateTimeCPAN モジュールがインストールされた 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

于 2022-01-19T18:28:18.147 に答える