我在开发过程中陷入困境,我需要以这样的方式找到两个日期之间的延迟,即...... 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);
任何人都可以建议我做些什么吗? 请指导我..
答案 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)
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捆绑在一起的麻烦的旧日期时间类。
以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 format,PnYnMnDTnHnMnS
,其中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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。