13

我有一组 ISO8601 格式的日期,需要对它们进行排序。有人对可行的算法提出建议吗?我不认为它们会按字符串排序,除非我错了,所以我认为它们必须分解成它们的组成部分?

有人可以发布一个算法,最好是与语言无关的算法,但是只要它只使用字符串和整数并且没有语言内置的函数,VB 或 C# 示例就可以工作。

谢谢!

4

2 回答 2

30

这取决于您是否混合格式。

在任何特定格式中,例如yyyy-mm-ddor yyyy-Www-d,ISO 8601 被构建为按字典顺序排序(负年份除外)。

ISO 8601 维基百科页面

日期和时间值从最重要到最不重要进行组织:年、月(或周)、日、小时、分钟、秒和秒的小数部分。因此,表示的字典顺序对应于时间顺序,但涉及负年份的日期表示除外。这允许日期按例如文件系统自然排序。

这意味着字符串排序应该可以正常工作。

只有混合格式才行不通。如果是这种情况,您需要在比较之前转换为特定格式。我的意思是yyyy-mm-dd在比较之前将所有格式转换为比较,然后在需要时再转换回来。

例如,如果您有输入数据:

2010-03-01
2010-W01-1

您可以先将它们全部更改为:

2010-03-01:2010-03-01
2010-01-04:2010-W01-1

(以特定形式为实际数据添加前缀)然后对其进行排序。排序后,您然后返回并剥离所有元素,直到:每个元素中的第一个字符,这将恢复原始形式。

不一定是最有效的方法,但如果您想保留原始表单,则需要执行类似操作。如果这不是问题,只需将它们转换为特定形式一次,然后保持原样。

于 2012-03-06T02:01:00.133 回答
12

我不认为它们会按字符串排序,除非我弄错了,

大错特错了:-)。它们将按字符串†</sup> 排序。这是 ISO 8601 相对于其他日期格式的主要优点之一。

见第 1 点: http ://en.wikipedia.org/wiki/ISO_8601#General_principles

...因此,表示的字典顺序对应于时间顺序...

†</sup>只要您不处理负年份,并且您使用相同的时区和子格式,即您不会混合基于月份和基于周(感谢@paxdiablo 和@whiskeysierra 指出这些)

于 2012-06-12T14:14:00.663 回答