按字典顺序排序的日期字符串格式按时间顺序递减?

时间:2014-04-21 13:20:27

标签: algorithm sorting date date-sorting

将日历日期编码为YYYY-MM-DD格式的字符串(带或不带分隔符,例如2014-04-212014.04.2120140421)具有以下属性:

  • 按字典顺序对字符串进行排序(将它们视为简单字符串,不知道它们代表什么)将它们按时间顺序排列
  • 日历日期和字符串之间的转换对于人类来说是显而易见的(2014-04-21显然代表April 21, 2014

请注意,要使其正常工作,日期(年,月和日)的每个组成部分必须始终使用相同数量的字符,如果数字太小,则前导零。这意味着YYYY只能代表9999年。如果我们想要代表5位数的年份,那么上面示例中的日期将变为02014-04-21

问题:

有没有办法将日历日期编码为字符串,这样按字典顺序对字符串进行排序会使它们按时间倒序排列?

理想情况下,人类很容易在日历日期和您建议的格式之间进行转换,但即使您不管理(我的解决方案不是这样),我仍然想知道您的解决方案。< / p>

如果有帮助,您可能需要此限制:

  • 我只需要代表2001年1月1日到2099年12月31日之间的日期。

我能想出的就是:

  • 提前选择最大可代表年份,例如2100
  • 如果这三个数字中的任何一个太低,则将年 - 月 - 日转换为(2100年),(13个月),(32天)并添加前导零,如上所述。
  • 因此Apr 21, 2014变为86-09-11

我的解决方案的主要问题是86-09-11代表April 21, 2014的人并不明显。

注意:

  • 我知道我可以按降序排序YYYY-MM-DD个字符串。那不是我想要的。
  • 您的格式不必分别代表字符串中的年,月和日。例如,您可以将日期编码为整数,显示“在2100年1月1日之前剩余的天数”,左侧填充为零。
  • 即使你找不到人类容易阅读的格式,我仍然希望看到你的答案并尽可能多地了解我的问题。
  • 我不是在寻找有关月/日歧义的讨论。我想有些人可能会发现2001-01-02含糊不清(1月2日或2月1日)。但这并不重要:阅读格式的人会提前知道格式是什么(在这种情况下是YYYY-MM-DD)所以没有歧义。

2 个答案:

答案 0 :(得分:2)

您可以使用9的补码 - 记下ISO日期,然后将每个数字替换为9减去该数字。至少我可以在头脑中应用编码/解码功能(它们是相同的)。但是,我不明白为什么你不仅仅保留一些冗余信息,将2006-01-02变成HJJD-JI-JH-2006-01-02,派生2006-01-02 - &gt; 7993-98-97 - &gt; HJJD-JI-JH通过替换0 - &gt; A,1 - &gt; B,2 - &gt; C,3 - &gt; D,4 - &gt; E,5 - &gt; F,6 - &gt; G,7 - &gt; H,8 - &gt;我,9 - &gt;学家

答案 1 :(得分:0)

如果有日期,也可以使用日期的Long值。从Long.MAX_VALUE中减去该数字,右填充为0,您将得到一个19位数字,当按字典顺序升序排序时,该数字将从最新到最旧排序。