我正在寻找比较 ISO 格式的两个日期(从文件动态接收) - 例如2011-12-14T17:22:52Z
- 在 Perl 中。我该怎么做?
问问题
2245 次
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
用于比较字符串。您可以使用数字比较器(、、、、和)来比较数字。请注意区分您要进行哪种类型的比较。le
gt
ge
eq
ne
cmp
<
<=
>
>=
!=
==
<=>
于 2012-05-01T13:55:14.947 回答
2
如果您的日期不一定在同一时区(问题没有明确提到这一点),那么您最好使用专用的日期和时间模块,而不是自己解析和计算日期字符串。下面是使用DateTime和DateTime::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 回答