以YYYY-MM-DD
格式(带或不带分隔符,例如2014-04-21
、2014.04.21
或20140421
)将日历日期编码为字符串具有以下属性:
- 按字典顺序升序排列字符串(将它们视为简单字符串,不知道它们代表什么)会按时间顺序排列
- 日历日期和字符串之间的转换对人类来说是显而易见的(
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位数字,当按字典升序排序时,它将从最新到最旧排序。