当前位置:  开发笔记 > 编程语言 > 正文

使用DateTime :: Format :: Strptime移动时区

如何解决《使用DateTime::Format::Strptime移动时区》经验,为你挑选了1个好方法。

请先查看Perl代码.

use DateTime::Format::Strptime;

my $strp = DateTime::Format::Strptime->new(
    pattern => '%Y-%m-%d%H:%M:%S',
);
my $dt = $strp->parse_datetime('2015-07-0611:21:33');

print $dt->epoch, "\n";
print $dt->ymd . ' ' . $dt->hms, "\n";
$dt->set_time_zone( 'local' );
print $dt->epoch,"\n";
print $dt->ymd . ' ' . $dt->hms, "\n";

输出:

1436181693
2015-07-06 11:21:33
1436149293
2015-07-06 11:21:33

我想改变时区.

$dt->epoch变化,但$dt->ymd$dt->hms没有改变.

我不知道为什么.

请帮帮我.



1> simbabque..:

您正在处理浮动时区.

my $dt = $strp->parse_datetime('2015-07-0611:21:33');
say $dt->time_zone;

在我的机器上,这是在欧洲/柏林时区,这给出了:

DateTime::TimeZone::Floating=HASH(0x1dd1f68)

该日期时间的文档有这样一段话:

如果旧时区是浮动时区,则除了考虑闰秒之外,不会对当地时间进行调整.如果新时区是浮动的,则调整UTC时间以保持当地时间不变.

我机器上其余程序的输出是:

1436181693
2015-07-06 11:21:33
1436174493
2015-07-06 11:21:33

两个纪元价值之间的差异是7200.那是两个小时.

$dt->set_time_zone( 'local' );
say $dt->time_zone;
# DateTime::TimeZone::Europe::Berlin=HASH(0x27dc1d8)

让我们来看看时区的事情.DateTime :: TimeZone :: Floating在DateTime对象中没有给出时区时使用.设置时区以local更新对象.

它假定浮动时区是UTC时间,因此它将UTC增加一小时到柏林,另一个因为那时柏林有夏令时.


这都是理论上的.关键是,设置time_zoneDateTime对象不会立即转换它.如果您从浮动时区开始,它会更改附加到日期和时间的时区.这是一个区别.只有当你再次调用它时,它才会转换.

use strict;
use warnings;
use feature 'say';
use DateTime::Format::Strptime;

my $strp = DateTime::Format::Strptime->new(
                    pattern => '%Y-%m-%d%H:%M:%S',
                );

my $dt = $strp->parse_datetime('2015-07-0611:21:33');
say $dt->time_zone;
say $dt->epoch;
say $dt;

say "changing to UTC...";
$dt->set_time_zone( 'UTC' );
say $dt->time_zone;
say $dt->epoch;
say $dt;

say "changing to local...";
$dt->set_time_zone( 'local' );
say $dt->time_zone;
say $dt->epoch;
say $dt;

这是我机器上的输出:

DateTime::TimeZone::Floating=HASH(0x1887f98)
1436181693
2015-07-06T11:21:33
changing to UTC...
DateTime::TimeZone::UTC=HASH(0x177dfd8)
1436181693
2015-07-06T11:21:33
changing to local
DateTime::TimeZone::Europe::Berlin=HASH(0x19a84c0)
1436181693
2015-07-06T13:21:33

如您所见,第一个set_time_zone使DateTime对象不再处于浮动时区.第二个调用从一个实际时区转换为另一个,时间会发生变化.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有