向前或向后排序ISO 8601日期

alp*_*der 12 language-agnostic sorting iso8601

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

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

谢谢!

pax*_*blo 27

这取决于你是否混合格式.

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

来自ISO 8601维基百科页面:

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

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

只有当你混合格式时才会起作用.如果是这种情况,您需要在比较之前转换为特定格式.通过这种方式,我的意思是将所有格式转换为yyyy-mm-dd比较之前,然后如果需要则返回.

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

2010-03-01
2010-W01-1
Run Code Online (Sandbox Code Playgroud)

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

2010-03-01:2010-03-01
2010-01-04:2010-W01-1
Run Code Online (Sandbox Code Playgroud)

(使用特定表单为实际数据添加前缀)然后对其进行排序.一旦排序,然后返回并剥离:每个元素中的第一个字符,这将恢复原始形式.

不一定是最有效的方式,但如果你想保留原始形式,你需要做类似的事情.如果这不是问题,只需将它们转换为特定的表格一次,然后将它们保留下来.


rjm*_*nro 10

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

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

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

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

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

  • 很好的设计但是如果你有很多日期,仍然比在unix epoch millis或sec上排序要慢得多 (2认同)