perl - Perl Date::Manip 检测到 EST 和 EDT 的时区错误
问题描述
我有系统时区为 EST 的服务器
它被设置为
# timedatectl set-timezone EST
# timedatectl
Local time: Tue 2019-06-18 03:29:42 EST
Universal time: Tue 2019-06-18 08:29:42 UTC
RTC time: Tue 2019-06-18 08:29:42
Time zone: EST (EST, -0500)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
然后在我的perl代码中,我尝试检测时区并将时间转换为 UTC 并且由于某种原因,时区被检测为 EDT。目前(夏季)EST 是我们在 EDT 之后的一个
我的 perl 代码是
# cat test.cgi # code file is named test.cgi
#!/usr/bin/perl -w
use Date::Manip;
print "Local time: ".UnixDate("now","%Y-%m-%d %H:%M:%S %Z")."\n";
# get local system timezone
my $TZ = UnixDate("now","%Z");
# convert time to GMT
my $dtlocal = Date_ConvTZ(ParseDate(UnixDate("now","%g")),$TZ,"GMT");
# format GMT time
my $dt = UnixDate($dtlocal,"%Y-%m-%d %H:%M:%S");
print "Timezone: $TZ\n";
print "UTC time: $dt\n";
我执行脚本
# date
Tue Jun 18 04:17:56 EST 2019
# date -u
Tue Jun 18 09:17:58 UTC 2019
# ./test.cgi
Local time: 2019-06-18 04:18:00 EDT
Timezone: EDT
UTC time: 2019-06-18 08:18:00
Date::Manip 错误检测时区的原因是什么?还有其他检测系统时区的好方法吗?
更新。
我刚刚发现 POSIX 正确检测时区。所以,问题在于 Date::Manip
use POSIX;
print strftime("%Z", localtime()), "\n";
解决方案
Date::Manip::TZ 文档有一个关于确定系统时区的部分。如果您向下滚动一点,您会找到一个列表,其中列出了使用哪些方法(以及以什么顺序)来确定系统时区,具体取决于您是在 Unix 还是 Windows 下运行。
根据您在问题中发布的内容,它似乎正确读取了当地时间,但未能识别正确的时区,因此您应该能够通过查看使用的 TZ 识别方法列表找到根本问题在您的操作系统上。(即,对于 Unix,检查$::TZ
,然后是环境设置,然后zone
,等等,直到您找到一个既存在又列出了错误时区的设置)TZ
/etc/TIMEZONE
推荐阅读
- angular - 使用 angular-oauth2-oidc 实现 OAuth2 代码流
- javascript - 无法将 mysql 返回的对象推送到数组中
- css - 获取要在语义 UI 中的导航栏下显示的 Flash 消息
- html - Bootstrap 4:垂直和水平对齐 div 中的文本(具有给定的 div 高度)
- r - R Diff函数:处理每组的第一个值
- git - git push 仅在远程连接时挂起
- c# - 了解循环内变量的局部函数捕获
- mongodb - MongoDB Atlas 辅助分片保持空闲
- python - 来自 HTTPRequestHandler 的请求问题
- c# - .Net Core 3.1 Entity Framework - 将现有表结构复制到另一个模式