从日期生成唯一整数

3

这是一般编程问题,但我正在使用Java语言。

给定一个日期 dd-mm-yydd-mm-yyyy (例如 13-01-2011),我想将其转换为唯一的数字,以便任何两个日期都有不同的数字。年份并不重要,因此只需将 dd-mm 转换为一个唯一的整数即可。有没有人知道实现这个算法的方法?

抱歉,我想更具体一些:

唯一的数字应该在1到365(或0到364)之间,或者应该按照模365唯一地分解。(我暂时忽略闰年的情况)。

因此,将“ddmm”连接起来可能是一个唯一的4位数。但是对于模365而言,可能不是唯一的。


1
什么是功能需求?这个问题可能需要在其他地方解决。否则,你可以使用已经有equals()方法的Date。编辑:等等,你想要将两个具有相同dd-MM的日期视为相等吗?(请注意,mm代表分钟,而不是月份) - BalusC
@BalusC:目前的要求是dd-MM。虽然这可能会改变,但我不想成为必须修改代码的人,而这些代码本来可以只用两行就解决。 - Stefan Kendall
闰年有366天,所以在模365的情况下,一年的第一天和最后一天是相同的。 ;) - Peter Lawrey
6个回答

3

所以你基本上想要获取一年中的第几天?这并不同于“从日期获取唯一的整数”。

使用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
这不仅是一个糟糕的建议,而且很难实现。 - Stefan Kendall
实现很容易,只需从日历对象中提取一年中的天数即可。您能帮我理解为什么这个建议不好吗?问题提出者并不关心年份或时间。 - jzd
1
是的,那就是我要做的。这很简单,但我想知道是否有更快的方法或内置的方法可以完成它。 - user485498
1
@Stefan:根据我的理解,这实际上回答了问题,而你的回答没有。 - ColinD
我唯一看到的问题是在2月29日之后的闰年。如果你想让f(3月1日,'04) = f(3月1日,'05),那么在创建日历并获取当年的天数之前,你可能需要调整年份。 - ILMTitan
显示剩余2条评论

0
new Date().getTime()

1970 年以来的毫秒数应该对于每个日期都是唯一的。只需将字符串转换为日期对象,然后使用getTime()函数即可。

  DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
  Date date = formatter.format( myInput );

那么如果有两个毫秒数相同的日期呢? - BalusC
请阅读问题:“以便任何两个日期都具有不同的数字”。我几乎可以确定这符合OP的确切要求。 - Stefan Kendall
我只是不明白那有什么意义。也许只是我自己的问题 :) - BalusC
保证 MS 是唯一的,尽管 OP 表示现在年份无关紧要,但未来可能会有所不同。如果是这种情况,则采取简单的方式(在这种情况下,通用情况是最好的,因为它可以修改为从日期到毫秒数具有唯一性)。始终注意用户需求的变化趋势。 - Stefan Kendall
1
虽然很难确定,但我认为 OP 只想要一个针对任何给定的月/日组合都是唯一的 int 值(因为他说年份不重要)。这个答案不仅考虑了年份,还考虑了时间。因此,我认为这个答案并没有回答问题。 - ColinD
修复年份后,这个问题就可以解决了。我有一种难以摆脱的感觉,就是像我这样的人会在三个月后回来,将JAN->1的映射转换成一个合适的唯一标识生成器。 - Stefan Kendall

0

0

更新:OP澄清了问题,要求在1-364范围内获得唯一值。在这种情况下,我会将日期转换为Calendar对象,并调用get(Calendar.DAY_OF_YEAR)方法 - 这将返回一年中的天数,这似乎正是OP想要的。

原始答案: 有许多方法可以做到这一点,就像有许多细节一样。如果您想能够使用唯一数字来相对比较日期,则最明显的解决方案是做大多数计算机已经做的事情,即将日期转换为某个最低公共分母,例如从特定时期开始的秒数。Java提供了使用DateCalendar类进行此操作的方法。如果您只关心天数和月份,则可以使用类似于int v = (month * 120) + day的内容实现相同的效果。如果您不关心比较,只想要一个唯一的值,则可以使用某种哈希算法对日期进行摘要。在Java中,例如,您可以获取日期的String表示形式并对其调用hashCode()方法。


1
month*12+day不能工作,因为多个日期将有相同的数字。 - user485498
是的,我没有仔细考虑数字,但你明白我的意思。 - Stewart Murrie

0

如果您只需要一个唯一的键,可以使用Calendar类的hashCode()方法。
或者,您可以将两位数的月份和日期与四位数的年份连接在一起。


抱歉,没有意识到其他人正在同时回答相同的答案。 - dj18
日历的hashCode()方法不能保证对于不同的日期返回不同的值。 - jarnbjo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接