【问题标题】:Unique int from Date日期的唯一 int
【发布时间】:2011-01-12 16:32:36
【问题描述】:

这是一般编程,但我正在使用 Java。

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

对不起:我想更具体一点:

唯一数字应该是从 1 到 365(或 0 到 364),或者应该以唯一的模 365 分解。(目前我忽略了闰年的情况)。

因此连接“ddmm”可能是一个唯一的 4 位数字。但是模 365 可能不会是唯一的。

【问题讨论】:

  • 功能需求是什么?这个问题可能需要在其他地方解决。否则你可以坚持使用Date,它本身已经有一个equals() 方法......编辑:等等,你想考虑两个具有相同dd-MM 的日期相等吗? (注意mm 代表分钟,而不是月)
  • @BalusC:dd-MM 是当前要求。这可能会改变,我不想成为不得不修改可能只使用两行代码的人。
  • 闰年有 366 天,所以一年的第一个和最后一个模 365 相同。 ;)

标签: java date calendar


【解决方案1】:

所以你基本上想得到一年中的哪一天?这与“从日期开始的唯一 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);

正如您已经承认的那样,在闰年/非闰年进行比较会失败。

【讨论】:

    【解决方案2】:

    使用自年初以来的天数。

    【讨论】:

    • 这不仅是一个糟糕的建议,而且很难实施。
    • 实现很简单,只需从 Calendar 对象中提取一年中的某一天。你能帮我理解为什么这个建议不好吗?提问者不关心年份或时间。
    • 这比仅仅使用给定的所有数据要多得多,即使它被忽略了。数据最终可能看起来更好,但我更关心代码而不是数据。
    • 是的,这就是我要做的。它很简单,但我想知道是否有更快的方法,或者可以做到这一点的内置方法。
    • @Stefan:当我读到它时,这实际上回答了你的答案没有回答的问题。
    【解决方案3】:
    new Date().getTime()
    

    自 1970 年以来的毫秒数对于每个日期应该是唯一的。只需将字符串转换为日期对象并使用getTime()

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

    【讨论】:

    • 那么两个日期的毫秒数相同呢?
    • 阅读问题。 “所以任何两个日期都有不同的数字”。我几乎肯定符合 OP 的确切要求。
    • 我只是看不出这有什么意义。也许只是我:)
    • MS 保证是独一无二的,虽然 OP 说现在年份并不重要,但没有理由不考虑未来。在这种情况下,采取简单的方法(在这种情况下是一般情况,因为可以对其进行修改以使唯一数字下降到包括毫秒在内的日期)。时刻注意用户需求的变化趋势。
    • 虽然很难确定,但在我看来,OP 只想要一个对于任何给定的月/日组合都不同的 int 值(因为他说年份并不重要)。这个答案不仅会影响一年,还会影响一天中的时间。因此,我认为这不能回答问题。
    【解决方案4】:

    使用 unix 时间戳见java.util.Date.getTime()

    【讨论】:

      【解决方案5】:

      如果您只需要一个唯一键,Calendar 的 hashCode() 应该可以解决问题。
      或者,您可以连接两位数的月份和日期,以及四位数字的年份。

      【讨论】:

      • 抱歉,没有意识到其他人同时回答了相同的答案。
      • Calendar 的 hashCode() 方法不能保证在不同的日期返回不同的值。
      【解决方案6】:

      更新:OP 澄清了需要 1-364 范围内的唯一值的问题。在这种情况下,我会将日期转换为 Calendar 对象并在其上调用 get (Calendar.DAY_OF_YEAR) - 这将返回一年中的天数,这正是 OP 看起来的样子。

      原答案: 执行此操作的方法与字符串的位数一样多。如果您希望能够使用唯一数字来进行日期的相对比较,那么最明显的解决方案是做大多数计算机无论如何都会做的事情,即将日期转换为某个最低公分母,例如特定时期的秒数。 Java 通过DateCalendar 类提供了执行此操作的方法。如果您只关心几天和几个月,您可以使用int v = (month * 120) + day 之类的东西来实现相同的目标。如果您不关心比较并且只想要一个唯一值,您可以使用某种散列算法得出日期摘要。例如,在 Java 中,您可以使用 String 表示日期并在其上调用 hashCode()

      【讨论】:

      • month*12+day 不起作用,因为多个日期将具有相同的数字。
      • 是的,我没有仔细考虑这些数字,但你明白了。
      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 2017-03-13
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多