2

我正在寻找比较 ISO 格式的两个日期(从文件动态接收) - 例如2011-12-14T17:22:52Z- 在 Perl 中。我该怎么做?

4

2 回答 2

9

您展示的ISO 8601表示法的最大优点是它可以与字符串比较进行比较:

my $v1 = "2011-12-14T17:22:52Z";
my $v2 = "2012-01-03T19:13:49Z";

print "$v1 earlier than $v2\n" if $v1 lt $v2;

这假设这些值都是祖鲁时间(Z 是时区,又名 UTC)。如果您有不同的时区,那么您需要标准化为单个时区(UTC 是一个明智的选择)然后进行比较。


请注意术语字符串比较

在 Perl 中,<运算符比较两个数字。所呈现的值将被钩子、骗子或蛮力和无知强制转换为一个数字。例如,if ("A" == "B")是真的,因为"A"被视为一个数字是0,所以是"B"。仅当您使用数字比较时,日期/时间字符串才会被视为数字是年份组件。

字符串比较运算符(其助记符可能基于原始的 Fortran 比较运算符:、、、、、、和)lt用于比较字符串。您可以使用数字比较器(、、、、和)来比较数字。请注意区分您要进行哪种类型的比较。legtgeeqnecmp<<=>>=!===<=>

于 2012-05-01T13:55:14.947 回答
2

如果您的日期不一定在同一时区(问题没有明确提到这一点),那么您最好使用专用的日期和时间模块,而不是自己解析和计算日期字符串。下面是使用DateTimeDateTime::Format::ISO8601模块的示例:

use DateTime::Format::ISO8601;

my $dt1 = DateTime::Format::ISO8601->parse_datetime('2011-12-14T17:22:52Z');
my $dt2 = DateTime::Format::ISO8601->parse_datetime('2011-12-14T17:22:52+01:00');

if ($dt1 < $dt2) {
    print "$dt1 is first\n";
} else {
    print "$dt2 is first\n";
}

请注意,比较使用两个对象之间的数字比较,这与基于字符串的答案中的字符串比较不同。这是因为DateTime重载了比较运算符和字符串插值“运算符”。

于 2012-05-01T17:58:58.817 回答