Alp*_*a2k 3 java timestamp calendar date
我试图计算两个时间戳之间的时间差,这是代码:
Calendar calendar = Calendar.getInstance();
java.util.Date now = calendar.getTime();
Timestamp currentTimestamp = new Timestamp(now.getTime());
System.out.println("Current\n"+currentTimestamp);
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("28/02/2015");
Timestamp timestampBefore = new Timestamp(date.getTime());
System.out.println("Before\n"+timestampBefore);
Timestamp calculated = new Timestamp(currentTimestamp.getTime() - timestampBefore.getTime());
System.out.println("Calculated\n"+calculated);
Run Code Online (Sandbox Code Playgroud)
输出:
Current
2015-02-28 12:12:40.975
Before
2015-02-28 00:00:00.0
Calculated
1970-01-01 13:12:40.975
Run Code Online (Sandbox Code Playgroud)
我可以理解为什么它会返回1970-01-01,但为什么它会13:12:40.975多返回 1 小时?
如何计算两个日期之间的差异,以便输出如下(基于此示例):
年:0,月:0,天:0,小时:12,分钟:12,秒:40?
更新:对于低于 1.8 的 java,请查看http://www.joda.org/joda-time/index.html
,对于 java 1.8,请参阅答案。
此处类似的解决方案: Java 8:计算两个 LocalDateTime 之间的差异
(1) 时间戳是一个时间点。如果计算两个时间戳之间的差异,则结果不是时间戳(时间点),而是持续时间。因此将差异转换为时间戳是无意义的,因此讨论结果奇怪的原因是没有意义的。
(2) 您可能应该使用新的Java 8 time API(如果您能够使用 Java 8):
LocalTime now = LocalTime.now();
LocalTime previous = LocalTime.of(0, 0, 0, 0);
Duration duration = Duration.between(previous, now);
System.out.println(now);
System.out.println(previous);
System.out.println(duration);
Run Code Online (Sandbox Code Playgroud)
请注意,这仅计算一天中两个时间之间的持续时间(小时-分钟-秒)。如果您想包含日期信息,请LocalDateTime改用:
LocalDateTime nextFirework = LocalDate.now()
.with(TemporalAdjusters.firstDayOfNextYear())
.atTime(LocalTime.MIDNIGHT);
LocalDateTime now = LocalDateTime.now();
// duration (in seconds and nanos)
Duration duration = Duration.between(now, nextFirework);
// duration in total hours
long hours = now.until(nextFirework, ChronoUnit.HOURS);
// equals to: duration.toHours();
Run Code Online (Sandbox Code Playgroud)
如果您想要以年/月/日/小时/秒为单位的“标准化”持续时间,令人惊讶的是没有直接支持。您可以自行将持续时间转换为天、小时、分钟和秒:
long d = duration.toDays();
long h = duration.toHours() - 24 * d;
long m = duration.toMinutes() - 60 * duration.toHours();
long s = duration.getSeconds() - 60 * duration.toMinutes();
System.out.println(d + "d " + h + "h " + m + "m " + s + "s ");
Run Code Online (Sandbox Code Playgroud)
但请注意,将天数转换为月和年会遇到困难,因为每月没有唯一的天数,而且一年可能是有 366 天的闰年。为此,您可以使用Period,与 相反Duration,此类与时间线关联。不幸的是,Period仅支持日期,但不支持时间:
// period in years/months/days (ignoring time information)
Period p = Period.between(now.toLocalDate(), nextFirework.toLocalDate());
System.out.println(p); // or use p.getYears(), p.getMonths(), p.getDays()
Run Code Online (Sandbox Code Playgroud)
因此,您可能可以结合这两种方法 - 首先,计算Period日期,然后Duration使用时间。请注意,持续时间可能为负数,因此在以下情况下您必须注意这一点:
Duration dur = Duration.between(start.toLocalTime(), end.toLocalTime());
LocalDate e = end.toLocalDate();
if (dur.isNegative()) {
dur = dur.plusDays(1);
e = e.minusDays(1);
}
Period per = Period.between(start.toLocalDate(), e);
System.out.println(per.toString() + ", " + dur.toString());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8752 次 |
| 最近记录: |