Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 将ISO 8601日期向前或向后排序_Sorting_Language Agnostic_Iso8601 - Fatal编程技术网

Sorting 将ISO 8601日期向前或向后排序

Sorting 将ISO 8601日期向前或向后排序,sorting,language-agnostic,iso8601,Sorting,Language Agnostic,Iso8601,我有一个ISO8601格式的日期数组,需要对它们进行排序。有没有人对可行的算法有什么建议?我不认为它们会按字符串排序,除非我大错特错,所以我假设它们必须分解成它们的组成部分 有人可以发布一个算法,最好是语言无关的,但是VB或C#示例可以工作,只要它只使用字符串和整数,而不使用语言内置的函数 谢谢 这取决于你是否在混合格式 在任何特定格式中,如yyyy-mm-dd或yyyy-Www-d,ISO 8601都可以按字典顺序进行排序(负年份除外) 从: 日期和时间值从最重要到最不重要:年、月(或周)、日

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

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


谢谢

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

在任何特定格式中,如
yyyy-mm-dd
yyyy-Www-d
,ISO 8601都可以按字典顺序进行排序(负年份除外)

从:

日期和时间值从最重要到最不重要:年、月(或周)、日、小时、分钟、秒和秒的分数。因此,除了涉及负年份的日期表示外,表示的词典顺序与时间顺序相对应。这允许按文件系统等自然方式对日期进行排序

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

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

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

2010-03-01
2010-W01-1
您可以首先将它们全部更改为:

2010-03-01:2010-03-01
2010-01-04:2010-W01-1
(在实际数据前加上特定的表单)然后对其排序。排序后,返回并删除每个元素中第一个
字符之前的所有内容,这将恢复原始形式

这不一定是最有效的方法,但如果您想保留原始形式,则需要这样做。如果这不是一个问题,只需将它们转换为特定的形式一次,然后就这样离开了

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

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

见第1点:

。。。因此,表达的词典顺序对应于时间顺序


†只要您不处理负年份,您就使用相同的时区和子格式,即您不混合使用月和周(感谢@paxdiablo和@Whiskysierra指出这些)

设计不错,但仍然比unix epoch millis或sec上的排序慢得多如果你有许多DateStimeZone也会破坏顺序,不是吗?@ChristopherRoussy字符串排序可能与转换+数字排序一样快,这取决于上下文。如果这是在数据库中,那么您可能无论如何都应该使用数据库的日期类型,并让它处理这个问题。也没有人说速度是这里的一个问题。@rjmunro当然转换是昂贵的,如果你能避免首先转换,你可以使用低级别的毫秒日期获得更好的性能,我只想说ISO8601很好,但并不总是合适的