将日历日期编码为YYYY-MM-DD格式的字符串(带或不带分隔符,例如2014-04-21,2014.04.21或20140421)具有以下属性:
>按字典顺序对字符串进行排序(将它们视为简单字符串,不知道它们代表什么)将它们按时间顺序排列
>日历日期和字符串之间的转换对于人类来说是显而易见的(2014-04-21显然代表2014年4月21日)
请注意,要使其工作,日期(年,月和日)的每个组件必须始终使用相同数量的字符,如果数字太小,则前导零.这意味着YYYY只能代表9999年.如果我们想要代表5位数年份,那么上面例子中的日期就变成了02014-04-21.
题:
有没有办法将日历日期编码为字符串,以便按字典顺序对字符串进行排序,使它们按时间倒序排列?
理想情况下,人类很容易在日历日期和你建议的格式之间进行转换,但即使你不管理这个(我的解决方案不是这样),我仍然想知道你的解决方案.
如果有帮助,您可能需要此限制:
>我只需要表示2001年1月1日到2099年12月31日之间的日期.
我能想到的就是:
>提前选择最大可代表年份,例如2100
>如果这3个数字中的任何一个太低,则将年 – 月 – 日转换为(2100年),(13个月),(32天)并添加如上所述的前导零.
>因此2014年4月21日成为86-09-11
我的解决方案的主要问题是,对于人类而言,86-09-11代表2014年4月21日并不明显.
笔记:
>我知道我可以按降序排序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,派生2006-01-02 – > 7993-98-97 – > HJJD-JI-JH通过替换0 – > A,1 – > B,2 – > C,3 – > D,4 – > E,5 – > F,6 – > G,7 – > H,8 – >我,9 – > J.