【问题标题】:Compare Timestamp with another Timestamp object将 Timestamp 与另一个 Timestamp 对象进行比较
【发布时间】:2013-11-15 04:24:20
【问题描述】:

我是 Java 新手。我正在使用两个时间戳对象dateFromdateTo。我想检查dateFrom 是否比dateTo 早45 天。我用这个代码片段来比较这个 if(dateFrom.compareTo(dateTo) < 45) { // do the action; }

我对代码中给出的45 感到困惑。我可以期待正确的结果吗?会不会符合我的结果。

【问题讨论】:

  • 为什么不自己运行代码并检查一下?!本来会更快,而且您自己会弄清楚结果。
  • .compareTo(...)通常的返回值是一个值“小于0表示小于,等于0表示等于,大于0表示大于”,我不相信你可以数通过使用此功能获得确切的差异量。相反,您应该使用成语dateFrom.compareTo(dateTo.add("45 days")),除了实际代码而不是伪代码。

标签: java timestamp


【解决方案1】:

compareTo() 根据结果返回值 -1、0 或 1。

你想做的是

long result = dateTo.getTime() - (1000 * 60 * 60 * 24 * 45) - dateFrom.getTime();
if(result >= 0) {
 System.out.println("dateFrom is 45 days or more before dateTo");
else {
 System.out.println("dateFrom is less than 45 days before dateTo");
}

虽然这很丑陋。您没有使用Calendar 是否有特定原因?

【讨论】:

  • 手动加秒是有风险的。有些事件改变了时间线,你知道吗?
  • 是的,我们都读过 Jon Skeet 的著名回答。我认为可以安全地假设 OP 不会处理这些极端情况。如果他这样做了,那么他应该使用真正的好方法来处理时间,比如 Joda Time 或Calendar
  • @Jeroen: 1000 * 60 * 24 * 45 不是 45 天内的毫秒数 - 45*24*3600*1000 是正确的数字
【解决方案2】:

您必须从逻辑上考虑一下。首先,您需要得到一个时间戳,该时间戳是dateTo 日期前 45 天。时间有不同的单位(秒、分钟、小时、天),所以在这种情况下只检查&lt; 45 是没有意义的。 compareTo() 方法只是用来排序知道时间戳是在另一个之前还是之后。

您可以先为时间戳创建 Calendar,然后在 45 天之前创建 add() dateFrom。然后你可以使用before()方法来检查dateFrom是否在dateTo之前。

【讨论】:

    【解决方案3】:

    使用 Joda Time 或 Calendar 类(将 45 天添加到 dateFrom,将结果与 dateTo 进行比较)。

    【讨论】:

      【解决方案4】:

      这样做

      Date dateFrom ="your from date";                 
      Calendar cal = GregorianCalendar.getInstance();
      cal .setTime(dateFrom);            
      cal.add(Calendar.DAY_OF_MONTH, 45);
      Date expireDate = cal.getTime();
      Date dateTo = new Date();
      if(dateTo.after(expireDate)){
      
      }
      

      【讨论】:

        【解决方案5】:

        由于 Java 中的时间戳是从 UNIX 纪元开始的毫秒数 - 将 45 天更改为毫秒数 (45d=45*24h=45*24*3600s=45*24*3600*1000ms) 所以如果:

        (time_B + 45*24*3600*1000) >= time_A
        

        这意味着 time_B 比 time_A '进一步' 45 天(或更多)

        当然你也可以使用 JodaTime 和其他库。

        【讨论】:

        • 手动加秒是有风险的。有些事件改变了时间线,你知道吗?
        • 是的,我知道时区、夏令时等问题 - 其中一些问题甚至无法使用精美的库解决,这适用于大多数情况。
        • 嘿伙计们 - 为什么这么多反对票?所选答案在 45 天内计算的毫秒数不正确,而我的答案是正确的 - 那是怎么回事?
        • 我没有投反对票,但是您的回答并不完全正确,我们之前已经讨论过了。
        • @Silviu:我直接指的是你,但总的来说;-)。我知道这个答案甚至没有触及日期/时间操作可能出现的问题。我只是好奇为什么我多次被否决 - 但没关系。有很多描述 SO 潜在问题的花盆 - 例如 stackoverflow.com/questions/13698779/…
        猜你喜欢
        • 1970-01-01
        • 2018-04-06
        • 2012-04-21
        • 1970-01-01
        • 2012-12-13
        • 2016-04-04
        • 1970-01-01
        • 2018-08-04
        • 2023-03-12
        相关资源
        最近更新 更多