3

我在开发过程中陷入困境,我有这样的要求,我需要找到两个日期之间的延迟,即..currentdate-date from database

我需要以dd:hh:mm. 在参考了很多参考资料后,我发现了如何转换为单独的毫秒小时和分钟,但期待的是:如果结果是 X 毫秒,我需要以正确的日分钟和秒格式显示它

示例:2 天:03 分钟:46 秒

这是正在使用的代码:

Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar1.setTime(date);
calendar2.setTime(date1);
long milliseconds1 = calendar1.getTimeInMillis();
long milliseconds2 = calendar2.getTimeInMillis();
long diff = milliseconds1 - milliseconds2;
System.out.println("diff ::"+diff);
long diffSeconds = diff / 1000;
long diffMinutes = diff / (60 * 1000);
long diffHours = diff / (60 * 60 * 1000);
long diffDays = diff / (24 * 60 * 60 * 1000);

谁能建议我进一步做什么?请指导我..

4

6 回答 6

8

使用乔达时间。Java API 不包含任何处理“两个日期/时间值之间的差异”的内容。在 Joda Time 中,您可以在Period(实际上是针对以日历为中心的差异)和 a Duration(实际上只是经过的时间差异)之间进行选择。

理想情况下,将 Joda Time 用于所有日期/时间问题 - 这是一个更好、更好的 API。

在这种情况下,我怀疑您在逻辑上得到了 a Duration,但您需要将其转换为 aPeriod以便将 aPeriodFormatter用于字符串转换。

于 2012-11-26T09:27:49.447 回答
3

你需要先计算diffDays

diffDays = diff / (24 * 60 * 60 * 1000);

然后计算剩余的毫秒数:

diff -= diffDays * 24 * 60 * 60 * 1000;

使用新的 diff 计算 diffHours 等等......

一个建议:使用像这样的常量值:

private static final int SECOND = 1000;
private static final int MINUTE = 60 * SECOND;
// and so on
于 2012-11-26T09:28:18.177 回答
1

-Joda当您处理任何日期时间问题时,我建议您使用图书馆。

Joda Time 有一个时间间隔的概念:

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

顺便说一下,Joda 有两个概念:Interval 表示两个时间点之间的时间间隔(表示上午 8 点到 10 点之间的时间),以及 Duration 表示没有实际时间界限的时间长度(例如,表示两个小时!)

于 2012-11-26T09:33:04.887 回答
1

使用 JodaTime,这真的很容易。请参阅以下代码:

public void testJoda() {
    DateTime then = new DateTime("2012-03-23T02:30:00.000");
    DateTime now = new DateTime("2012-03-24T02:29:00.000");

    DurationFieldType[] ddhhmm = { DurationFieldType.days(),
            DurationFieldType.hours(), DurationFieldType.minutes() };
    Period p = new Period(then, now, PeriodType.forFields(ddhhmm));
    System.out.println(p.toString());

    p = new Period(then, now, PeriodType.days());
    System.out.println(p.toString());

    p = new Period(then, now, PeriodType.hours());
    System.out.println(p.toString());

    DurationFieldType[] hhmm  = { DurationFieldType.hours(), DurationFieldType.minutes() };
    p = new Period(then, now, PeriodType.forFields(hhmm));
    System.out.println(p.toString());
}

测试间隔为 23h59m。它的输出与预期的一样:

PT23H59M
P0D
PT23H
PT23H59M

以同样的时间间隔,一天后,就在 3 月 25 日春季 DST 跳跃前后:

DateTime then = new DateTime("2012-03-24T02:30:00.000");
DateTime now = new DateTime("2012-03-25T03:29:00.000");

你正确地得到:

P1DT-1M
P1D
PT23H
PT23H59M

真的,没有比这更容易的了。

于 2012-11-27T18:10:39.683 回答
0
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
calendar1.setTime(date);
calendar2.setTime(date1);

int dayDiff = calendar1.get(Calendar.DAY_OF_MONTH) - calendar2.get(Calendar.DAY_OF_MONTH);  
int hourDiff = calendar1.get(Calendar.HOUR_OF_DAY) -calendar2.get(Calendar.HOUR_OF_DAY);   
int dayDiff = calendar1.get(Calendar.SECOND) - calendar2.get(Calendar.SECOND);
于 2012-11-26T09:32:04.073 回答
0
于 2018-05-07T20:22:42.573 回答