按字典顺序升序排列的日期字符串格式按时间顺序降序排列



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

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

请注意,为了实现这一点,日期的每个组成部分(年、月和日)必须始终使用相同数量的字符,如果数字太小,则必须以零开头。这意味着YYYY只能代表9999之前的年份。如果我们也想表示5位数的年份,那么上面例子中的日期就变成了02014-04-21

问题:

有没有一种方法可以将日历日期编码为字符串,使字符串按字典顺序升序排列,使其按逆时间顺序排列?

理想情况下,人类可以很容易地在日历日期和你建议的格式之间进行转换,但即使你没有做到这一点(我下面的解决方案没有做到),我仍然想知道你的解决方案。

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

  • 我只需要表示2001年1月1日至2099年12月31日之间的日期

我所能想到的就是:

  • 提前选择最大可代表年份,例如2100
  • 将年月日转换为(2100年)、(13个月)、(32天),如果这3个数字中的任何一个太低,则如上所述添加前导零
  • 因此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),因此没有歧义

您可以使用9的补码——记下ISO日期,然后用9减去该数字来替换每个数字。至少我可以在脑海中应用编码/解码功能(它们是一样的)。然而,我不明白为什么你不保留一些多余的信息,把2006-01-02变成HJJD-JI-JH-2006-01-02,通过替换0->A,1->B,2->C,3->D,4->E,5->F,6->G,7->H,8->I,9->J.来派生2006-01-02->7993-98-97->HJJD-JI-JH

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

最新更新