微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取经度/纬度并在 Perl 中获取 UTC 偏移量

如何解决获取经度/纬度并在 Perl 中获取 UTC 偏移量

当我对目的地时间的唯一了解是经度和纬度时,我正在尝试本地化 UTC 中的时间。我想出了一些有用的东西,但感觉很笨拙:

# We need to get localized time for display purposes.
state $moduleGeoLocation = require Geo::Location::TimeZone;
my $gltzobj = Geo::Location::TimeZone->new();
my $tzName = $gltzobj->lookup( lon => $params->{'longitude'},lat => $params->{'latitude'} );
say "TimeZone: " . $tzName;

到目前为止一切顺利。这就是 kludge 的用武之地。我正在使用 Time::Piece 的 strptime 解析时间,但我没有时区的 GMT 偏移量,因此在解析 Time::Piece 中的 UTC 时间后,我将它发送到 DateTime 以进行时区计算。同时使用 DateTime 和 Time::Piece 似乎很笨拙:

# Get TimeZoneOffset.
state $moduleDateTime = require DateTime;
state $moduleDateTimeTimeZone = require DateTime::TimeZone;
my $timeZone = DateTime::TimeZone->new( 'name' => $tzName );

my $timePiece = Time::Piece->strptime($hour->{'time'},'%Y-%m-%dT%H:%M:%sZ');
my $time = DateTime->from_epoch( 'epoch' => $timePiece->epoch,'time_zone' => $timeZone );

有没有更好的方法来完成我正在做的事情?我的目标是尽可能以最快的方式获得本地化时间的结果。

解决方法

您的问题归结为以下几点:

如何使用 %Y-%m-%dT%H:%M:%S 格式从时间戳创建 DateTime 对象。我有合适的时区作为 DateTime::TimeZone 对象。

要将日期时间解析为 DateTime,首先应寻找合适的 DateTime::Format:: 模块。

DateTime::Format::Strptime 将与您当前的尝试最相似。

use DateTime::Format::Strptime qw( );
 
my $format = DateTime::Format::Strptime->new(
   pattern   => '%Y-%m-%dT%H:%M:%S',strict    => 1,time_zone => $tz,on_error  => 'croak',);

my $dt = $format->parse_datetime($ts);

您也可以使用 DateTime::Format::ISO8601,但您不能将其用作验证器,因为它不只接受规定的格式。

use DateTime::Format::ISO8601 qw( );
 
( my $dt = DateTime::Format::ISO8601->parse_datetime($ts) )
   ->set_time_zone('floating')
   ->set_time_zone($tz);

鉴于后一种解决方案会覆盖任何明确提供的时区,为了清楚起见,我将使用第一种解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。