如何在Perl中排序时间戳?

问题描述:

我有几千个对象,其格式为"yyyy-MM-ddTHH:mm:ssZ"。我想按时间排序这些对象。如何在Perl中排序时间戳?

这是否有任何有用的软件包或脚本?

(目前我只是比较个别的数值,似乎它不是很有效,整洁。)

+0

您是指比较TTT的值,MM的值等。如果是这样,你indead需要将完整的字符串转换为时间戳值... – kriss 2010-03-21 15:08:49

您可以使用Time :: Local将日期转换为时间戳或从cpan中的Date :: modules之一。你可以看看this看看有什么可用的。

还要注意的是,使用上面的格式排序对象lexicographicaly也会做的伎俩(即使可能比比较数字稍慢,但初始转换有成本)。

如果您使用来自世界各地的日期,请小心,因为您可能会遇到与时区和夏令时有关的排序问题。如果所有的日期时间都在同一个地方,应该可以。

时间戳这种格式可以按字典顺序排序,所以正常的perl的“排序”和字符串比较函数“ cmp“就足够了。

+0

@Stuart:我也是这么认为,但是时区部分(Z)会不会提出一些问题? – kriss 2010-03-21 15:21:49

+1

@kriss:但这是最后一个字符,所以这意味着其他所有东西都是相同的 – 2010-03-21 15:39:28

+0

@kemp:是的,这就是问题,以前是一样的,但如果它与相同的参考时间没有关系,则比较可能会给出错误的结果。 – kriss 2010-03-21 16:29:17

sort没有排序功能按字典顺序排序。它满足您的需求。

@sorted = sort @timestamps; 
+0

我想他想按时间先排序,而不是日期。 – Zaid 2010-03-21 15:43:20

+0

对于混淆抱歉。我想按日期时间对它们进行排序。 – ablimit 2010-03-21 15:45:47

+3

在同一时区(Z,Zulu或UTC)中,时间戳ISO-8601订单的主要优点是它们可以按日期/时间顺序按字母顺序排序。如果你有多个时区需要处理,这是一个麻烦(你需要将它们全部转换为UTC,这不是完全无关紧要的,然后对UTC值进行排序)。但时区=一般的麻烦。 – 2010-03-21 16:04:25

如果您的字符串格式严格,您可以使用以下子例程来整理日期列表。

sub timeSort { 

    my ($time) = (shift =~ /\d{2}:\d{2}:\d{2}/); 
    return $time; 
} 

my @sortedList = sort { timeSort($a) <=> timeSort($b) } @oldList; 
+0

'$ _ [0]'而不是使用'shift'可能会更快(因为它会被多次调用)。否则,我就是这么做的。 – 2010-03-21 15:52:57