将经过的毫秒转换为正确的Java日期格式?

时间:2012-11-26 09:25:16

标签: java datetime elapsedtime elapsed

我在开发过程中陷入困境,我需要以这样的方式找到两个日期之间的延迟,即...... 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);

任何人都可以建议我做些什么吗? 请指导我..

6 个答案:

答案 0 :(得分:8)

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

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

在这种情况下,我怀疑你逻辑上得到了Duration,但你想要将其转换为Period才能使用{{} 3}}用于字符串转换。

答案 1 :(得分:3)

您需要先计算diffDays

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

然后计算剩余的毫秒数:

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

使用新差异计算diffHours等等......

建议:使用这样的常量值:

private static final int SECOND = 1000;
private static final int MINUTE = 60 * SECOND;
// and so on

答案 2 :(得分:1)

- 我建议您在处理任何日期时间问题时使用Joda库。

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

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

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

答案 3 :(得分: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

真的,这并不容易。

答案 4 :(得分: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);

答案 5 :(得分:0)

TL;博士

Duration.between(   // Represent a span of time, unattached to the timeline.
    earlier ,       // `Instant` class represents a moment in UTC with a resolution as fine as nanoseconds. Current moment captured in microseconds, depending on capability of host computer hardware and operating system.
    Instant.now()
)                   // Returns a `Duration` object. Call `to…Part` methods to get the days, hours, minutes, seconds as separate numbers.

java.time

使用现代 java.time 类更容易,这些类取代了与最早版本的Java捆绑在一起的麻烦的旧日期时间类。

以UTC格式获取当前时刻。 Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

当前时刻在Java 8中的milliseconds中具体捕获。在Java 9及更高版本中,由于Clock的全新实现,您可能会看到以更精细的粒度捕获的当前时刻。在macOS Sierra上的Oracle Java 9 JDK中,我得到microseconds中的当前时刻(小数点后六位数)。

Instant earlier = Instant.now() ;
…
Instant later = Instant.now() ;

计算经过时间作为未附加到时间轴的时间跨度。对于小时 - 分钟 - 秒(以及与日历无关的24小时时间段的天数),请使用Duration。对于年 - 月 - 日的比例,请使用Period

Duration d = Duration.between( earlier , later ) ;

生成字符串为standard ISO 8601 formatPnYnMnDTnHnMnS,其中P标记开头,T将年 - 月 - 天与小时 - 分 - 秒分开

String output = d.toString() ;  // Standard ISO 8601 format.

我强烈建议使用标准格式而不是问题中的格式。我已经看到时间格式会引起如此多的混乱和模糊,可能会被误认为是一天中的时间而不是一段时间。 ISO 8601格式的设计明智,以避免这种模糊。但是如果你坚持,在Java 9及更高版本中,你可以通过调用Duration方法来询问to…Part的部分内容。

long days = d.toDaysPart() ;  // 24-hour chunks of time, unrelated to calendar dates.
int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;

然后根据需要组装成一个字符串。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore