java - 计算两个 Java 日期实例之间的差异

标签 java date time timedelta java.util.date

我在 Scala 中使用 Java 的 java.util.Date 类,并且想要比较 Date 对象和当前时间。我知道我可以使用 getTime() 计算增量:

(new java.util.Date()).getTime() - oldDate.getTime()

然而,这只是给我留下了一个代表毫秒的long。有没有更简单、更好的方法来获取时间增量?

最佳答案

简单差异(无库)

/**
 * Get a diff between two dates
 * @param date1 the oldest date
 * @param date2 the newest date
 * @param timeUnit the unit in which you want the diff
 * @return the diff value, in the provided unit
 */
public static long getDateDiff(Date date1, Date date2, TimeUnit timeUnit) {
    long diffInMillies = date2.getTime() - date1.getTime();
    return timeUnit.convert(diffInMillies,TimeUnit.MILLISECONDS);
}

然后你可以调用:

getDateDiff(date1,date2,TimeUnit.MINUTES);

获取两个日期的差异(以分钟为单位)。

TimeUnitjava.util.concurrent.TimeUnit,一个从纳秒到天的标准 Java 枚举。

<小时/>

人类可读的差异(没有库)

public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {

    long diffInMillies = date2.getTime() - date1.getTime();

    //create the list
    List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
    Collections.reverse(units);

    //create the result map of TimeUnit and difference
    Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
    long milliesRest = diffInMillies;

    for ( TimeUnit unit : units ) {
        
        //calculate difference in millisecond 
        long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
        long diffInMilliesForUnit = unit.toMillis(diff);
        milliesRest = milliesRest - diffInMilliesForUnit;

        //put the result in the map
        result.put(unit,diff);
    }

    return result;
}

http://ideone.com/5dXeu6

输出类似于 Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0},其单位为已订购。

您只需将该 map 转换为用户友好的字符串即可。

<小时/>

警告

上面的代码片段计算两个时刻之间的简单差异。它可能会在夏令时切换期间导致问题,如 this post 中所述。 。这意味着,如果您计算没有时间的日期之间的差异,则可能会缺少一天/小时。

在我看来,日期差异有点主观,尤其是在几天内。您可以:

  • 计算24小时耗时:day+1 - day = 1 day = 24h

  • 计算耗时,考虑夏令时:day+1 - day = 1 = 24 小时(但使用午夜时间和夏令时可能是 0 天和 23 小时)

  • 计算日期切换的次数,这意味着天+1 下午 1 点 - 上午 11 点 = 1 天,即使耗时只有 2 小时(如果有夏令时则​​为 1 小时) :p)

如果您对日期差异的定义与第一种情况匹配,我的答案是有效的

使用 JodaTime

如果您使用 JodaTime,您可以通过以下方式获取 2 个瞬间(米莉支持 ReadableInstant)日期的差异:

Interval interval = new Interval(oldInstant, new Instant());

但是您还可以获得本地日期/时间的差异:

// returns 4 because of the leap year of 366 days
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5), PeriodType.years()).getYears() 

// this time it returns 5
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5+1), PeriodType.years()).getYears() 

// And you can also use these static methods
Years.yearsBetween(LocalDate.now(), LocalDate.now().plusDays(365*5)).getYears()

关于java - 计算两个 Java 日期实例之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58472985/

相关文章:

ios - 为 iPhone 应用程序设置到期日期

powershell - 如何找到 PowerShell 中的最短执行时间?

java - Oracle Java : Error casting java. sql.Blob 数据类型到 Oracle BLOB 数据类型

java - 如何在 Mockito 模拟对象调用另一个线程中的 void 方法后断言?

Java并发执行线程任务

java - 显示日期类中的日期

javascript - 仅获取日期的时间戳,反之亦然

java - 如何在Java中获取您所在时区的当前时间

.net - .NET DateTime/TimeSpan 的刻度有多长?

java - 扩展类而不添加任何新字段