这是一般编程,但我在Java工作。
鉴于日期dd-mm-yy
或dd-mm-yyyy
(例如13-01-2011),我想将其转换为唯一的数字,以便任何两个日期都有不同的数字。这一年并不重要。因此,将dd-mm转换为一个唯一的int是可以接受的。有谁知道这样做的算法?
我是SOrry:我想更具体一点:
唯一的数字应该是1到365(或0到364),或者应该以模数365分解。(我现在忽略了闰年的情况)。
如此连接" ddmm"可能是唯一的4位数字。但模数365可能不是唯一的。
答案 0 :(得分:3)
所以你基本上想要获得一年中的这一天?这与“从日期开始的独特int”不同。
使用Calendar#get(Calendar.DAY_OF_YEAR)
(从1开始)。
Date date = getItSomehow();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
正如您已经承认的那样,在闰/非闰年上进行比较将失败。
答案 1 :(得分:1)
使用自年初以来的天数。
答案 2 :(得分:0)
new Date().getTime()
自1970年以来的毫秒数应该是每个日期唯一的。只需将字符串转换为日期对象,然后使用getTime()
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
Date date = formatter.format( myInput );
答案 3 :(得分:0)
使用unix时间戳请参阅java.util.Date.getTime()
答案 4 :(得分:0)
更新:OP澄清了想要1-364范围内的唯一值的问题。在这种情况下,我会将日期转换为Calendar
对象并在其上调用get (Calendar.DAY_OF_YEAR)
- 这将返回一年中的一天的数字,这正是OP看起来之后的情况。 / p>
原始答案:
有很多方法可以做到这一点,因为有一些字符串。如果您希望能够使用唯一数字进行日期的相对比较,那么最明显的解决方案是执行大多数计算机所做的操作,即将日期转换为某个最低公分母,例如特定时期的秒数。 Java提供了使用Date
和Calendar
类执行此操作的方法。如果您只关心日期和月份,那么您可以通过int v = (month * 120) + day
之类的方式实现相同目标。如果您不关心比较并且只想要一个唯一值,那么您可以使用某种散列算法来提取日期摘要。例如,在Java中,您可以使用String
表示日期并在其上调用hashCode()
。
答案 5 :(得分:0)
如果你只需要一个唯一的密钥,Calendar的hashCode()应该可以解决这个问题 或者,您可以连接两位数的月份和日期以及四位数年份。