【发布时间】:2014-11-24 22:22:18
【问题描述】:
我想在日期之间进行比较,即使在夏令时更改后(例如 CEST 到 CET),它们也需要正确。问题是我无法与Date::Manip::Obj 一起工作。
在文档中,他们谈到Time::Piece 是可能的,我也对此进行了测试。
问题是我无法将 Date::Manip 解析的对象转换为 Time::Piece 对象。我怎样才能做到这一点?我有一个Date::Manip 对象,因为我需要使用这个库来解析 OpenSSL 数据包中的日期。
如果有人知道如何正确使用 Date::Manip 以适应日光变化时间,请告诉我。
这是一些测试比较的代码。 LastUpdate 变量只是过去的一个日期,因此当从 CEST 转到 CET 时,我可以将其与现在进行比较。
#!/usr/bin/perl
use strict;
use warnings;
use FindBin;
use Date::Manip::Date;
use Date::Manip::Delta;
use Date::Manip::TZ;
use Data::Dumper;
use Time::Piece;
use Time::Seconds;
# To simulate checking a recently-published CRL against the current time, set a lastUpdate time
# to now() - 1 minute (for instance). Then, using the OS date --set command, set the system date
# to a few seconds before the DST rollover from CEST to CET (happens at 03:00:00 on the last sunday
# of october -- 27 Oct in 2013), and then run the script.
my $date = new Date::Manip::Date "now";
my $delta = $date->new_delta();
my $tz = new Date::Manip::TZ;
$delta->parse("-00:01:00");
my $dmLastUpdate = $date->calc($delta);
my $tpLastUpdate = Time::Piece->new;
$tpLastUpdate -= ONE_MINUTE;
my $now = $date->new_date();
while (1)
{
$now->parse("now");
my $dmTz = $tz->curr_zone();
my $dmNowLarger = $now->cmp($dmLastUpdate);
my $tpNow = Time::Piece->new;
my $tpTz = $tpNow->strftime("\%Z (\%z)");
printf "\%-30s: \%s\n", "DateManip \$tz", (defined($dmTz) ? $dmTz : "");
printf "\%-30s: \%s\n", "DateManip now ", $date->printf("%C");
printf "\%-30s: \%s\n", "DateManip lastUpdate ", $dmLastUpdate->printf("%C");
printf "\%-30s: \%s\n", "DateManip now > lastUpdate ", $dmNowLarger;
printf "\%-30s: \%s\n", "TimePiece \$tz ", $tpTz;
printf "\%-30s: \%s\n", "TimePiece now ", $tpNow->strftime();
printf "\%-30s: \%s\n", "TimePiece lastUpdate ", $tpLastUpdate->strftime();
printf "\%-30s: \%s\n", "TimePiece now > lastUpdate ", ($tpNow > $tpLastUpdate);
printf "-------------------------------------------------------\n";
sleep (3);
}
夏令时从夏季变为冬季(欧洲中部时间凌晨 3 点到欧洲中部时间凌晨 2 点)的那一刻, cmp() 返回 -1,这应该是 1,因为如果您查看时区,它实际上是更晚的。
使用 Time:Piece,这种比较效果很好,所以我想将 date::manip 转换为 Time:piece
【问题讨论】:
-
为什么不放弃使用 Date::Manip 呢?多年来一直不推荐。您可以使用
strptime方法将日期直接解析为 Time::Piece 对象。 -
我现在正在尝试。但是,如果我添加一个特定的时区(如 GMT)并打印纪元,则纪元不在 GMT 时区中,而是在我的系统时区中。
-
我不明白这是什么意思。纪元值不在任何时区。这只是一个数字。无论您在哪个时区,都一样。
-
您是要为您的时区还是为另一个 TZ 进行计算? Time::Piece 似乎已本地化到您所在的时区——如果使用
strptime和使用new构造函数解析日期,它会将时区设置为您的系统设置的任何时间。使用 DateTime 之类的东西可能会更好。 -
DateTime 是我一直用于与日期或时间相关的任何事情。它可以接受不同格式的日期/时间,您可以使用它进行计算,因此它应该可以很好地满足您的需求。
标签: perl date time type-conversion