向前或向后排序ISO 8601日期

时间:2012-03-06 01:54:14

标签: sorting language-agnostic iso8601

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

有人可以发布算法,最好是语言不可知,但VB或C#示例只要使用字符串和整数而不使用内置于该语言的函数就可以工作。

谢谢!

2 个答案:

答案 0 :(得分:26)

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

yyyy-mm-ddyyyy-Www-d等任何特定格式中,ISO 8601用于按字典顺序排序(除负数年份外)。

来自ISO 8601 wikipedia page

  

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

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

只有当你 mix 格式不起作用时才会这样做。如果是这种情况,您需要在比较之前转换为特定格式。就此而言,我的意思是在比较之前将所有格式转换为yyyy-mm-dd,然后在需要时将其转换回来。

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

2010-03-01
2010-W01-1

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

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

(使用特定表单为实际数据添加前缀)然后对其进行排序。排序后,您可以返回并删除所有元素中的第一个:字符,这将恢复原始表单。

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

答案 1 :(得分:10)

  

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

错误的:-)。它们将排序为字符串。这是ISO 8601优于其他日期格式的主要优点之一。

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

  

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

只要您没有处理否定年份,您使用的是相同的时区和子格式,即您不会混合基于月份和基于周(感谢@ paxdiablo和@whiskeysierra将这些指出来了)