取 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);
鉴于后一种解决方案会覆盖任何明确提供的时区,为了清楚起见,我将使用第一种解决方案。
我正在尝试本地化 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);
鉴于后一种解决方案会覆盖任何明确提供的时区,为了清楚起见,我将使用第一种解决方案。