取 Longitude/Latitude 并在 Perl 中获取 UTC 偏移量

Take Longitude/Latitude and get UTC Offset in Perl

我正在尝试本地化 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;

到目前为止一切顺利。这就是问题所在。我正在使用 Time::Piece 的 strptime 解析时间,但我没有时区的 GMT 偏移量,所以在我解析 [=20] 中的 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 );

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

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

How do I create a DateTime object from a timestamp using the %Y-%m-%dT%H:%M:%S format. I have the appropriate time zone as a DateTime::TimeZone object.

要将日期时间解析为 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);

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