如何在 Perl 中转换时区?
我正在尝试在 Perl 中将日期/时间 GMT 0 转换为 GMT -6。
例如,DHCP 服务器租用时间采用以下格式:
2010/02/18 23:48:37
我正在尝试将该时间转换为本地时区(GMT -6),但需要它来遵守夏令时。
下面的脚本可能有点矫枉过正,但我不知道如何从这里继续。 (任何建议都会很棒)。
my $TIMESTART;
$TIMESTART = "2010/02/18 23:48:37";
$TIMESTART =~ s/\//-/g;
use DateTime;
use DateTime::TimeZone;
use DateTime::Format::MySQL;
my $dt = DateTime::Format::MySQL->parse_datetime($TIMESTART);
my $tz = DateTime::TimeZone->new( name => 'America/Chicago' );
print $tz->offset_for_datetime($dt) . "\n";
它将输出以下几行:
2010-02-18T23:48:37
-21600
我需要能够将 -21600 添加到日期中以获得 GMT -6 的本地时区,但我不知道如何解决这个问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
调用
set_time_zone
< /a> 方法 2 次:工作原理:
DateTime
对象时,set_time_zone
将时区更改为 “浮动”时区UTC
无需转换set_time_zone
将UTC
更改为America/Chicago
Call
set_time_zone
method 2 times:How it works:
DateTime
object without time zone specified, "floating" time zone is setset_time_zone
change time zone toUTC
without conversionset_time_zone
changeUTC
toAmerica/Chicago
这会将 UTC 时间转换为 ETC 时间。
您还可以使用日期的 +FORMAT 参数以任何格式使用日期/时间。
日期 --date='TZ="ETC" 18:30'
This will convert UTC time into ETC time.
You can also use date/time in any format using +FORMAT parameter of date.
date --date='TZ="ETC" 18:30'
Time::Piece
是一个非常轻量级的组件质量好的代码。或者您可以只使用内置函数和strftime
和POSIX::strptime
Time::Piece
is a very lightweight piece of code of good quality. Or you can just use built-ins andstrftime
andPOSIX::strptime
不要将时区与“DateTime::Format::MySQL->parse_datetime”一起使用
在执行与时区相关的任何操作时,有一个很好的理由不应该使用它。为什么?因为它完全不支持时区。请参阅文档:
如果您确实使用此功能,它将采用您的系统默认时区。这可能不是您想要转换的时区! (虽然这对很多人来说都有效,但只有当你的服务器不更改默认时区时,它才有效——之后,一切都会崩溃。)
使用 `DateTime->new()`,因为它支持时区
使用
DateTime
直接提供的构造函数(来源:MetaCPAN: DateTime.):使用 DateTime 转换时区
您的起始时区是您输入构造函数的任何内容(即
美国/芝加哥< /code> 在上面的例子中)。要将时间转换为结束时区,请使用
set_time_zone()
。工作代码
在下面的代码中,时间从一个时区转换为另一个时区,并且每次都能完美地完成此操作,即使您使用 Linux 操作系统为新加坡时间的服务器将纽约时间转换为旧金山时间。
输出:
Don't Use Timezones With `DateTime::Format::MySQL->parse_datetime`
There is a very good reason you shouldn't be using this when doing anything relating to timezones. Why? Because it has absolutely no support for timezones whatsoever. Please see the documentation:
If you DO use this, it will assume your system time zone default. This might not be the timezone you want to convert from! (Although this will work for many people, it only works as long as your servers don't change their default timezone — after that, everything breaks.)
Use `DateTime->new()`, Because It DOES Support TimeZones
Use the constructor that
DateTime
provides directly (Source: MetaCPAN: DateTime.):Convert TimeZones with DateTime
Your starting time zone is whatever you feed into the constructor (i.e.,
America/Chicago
in the above example). To convert a time to an ending time zone, useset_time_zone()
.Working Code
In the code below, a time is converted from one timezone to another, and it does this perfectly every time, even you are converting New York time to San Francisco time with a server whose Linux OS is in Singapore time.
Output: