如何findjava中两个date之间的差异的持续时间?
我有两个DateTime对象,它们需要查找它们的区别的持续时间 ,
我有下面的代码,但不知道如何继续得到预期的结果如下:
例
11/03/14 09:30:58 11/03/14 09:33:43 elapsed time is 02 minutes and 45 seconds ----------------------------------------------------- 11/03/14 09:30:58 11/03/15 09:30:58 elapsed time is a day ----------------------------------------------------- 11/03/14 09:30:58 11/03/16 09:30:58 elapsed time is two days ----------------------------------------------------- 11/03/14 09:30:58 11/03/16 09:35:58 elapsed time is two days and 05 mintues
码
String dateStart = "11/03/14 09:29:58"; String dateStop = "11/03/14 09:33:43"; Custom date format SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd HH:mm:ss"); Date d1 = null; Date d2 = null; try { d1 = format.parse(dateStart); d2 = format.parse(dateStop); } catch (ParseException e) { e.printStackTrace(); } // Get msec from each, and subtract. long diff = d2.getTime() - d1.getTime(); long diffSeconds = diff / 1000 % 60; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000); System.out.println("Time in seconds: " + diffSeconds + " seconds."); System.out.println("Time in minutes: " + diffMinutes + " minutes."); System.out.println("Time in hours: " + diffHours + " hours.");
尝试以下
{ Date dt2 = new DateAndTime().getCurrentDateTime(); long diff = dt2.getTime() - dt1.getTime(); long diffSeconds = diff / 1000 % 60; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000); int diffInDays = (int) ((dt2.getTime() - dt1.getTime()) / (1000 * 60 * 60 * 24)); if (diffInDays > 1) { System.err.println("Difference in number of days (2) : " + diffInDays); return false; } else if (diffHours > 24) { System.err.println(">24"); return false; } else if ((diffHours == 24) && (diffMinutes >= 1)) { System.err.println("minutes"); return false; } return true; }
使用Java内置类TimeUnit可以更好地处理date差异转换。 它提供了实用的方法来做到这一点:
Date startDate = // Set start date Date endDate = // Set end date long duration = endDate.getTime() - startDate.getTime(); long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration); long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration); long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
使用乔达时间库
DateTime startTime, endTime; Period p = new Period(startTime, endTime); long hours = p.getHours(); long minutes = p.getMinutes();
乔达时间有一个时间的概念间隔:
Interval interval = new Interval(oldTime, new Instant());
另一个例子date差异
多一个链接
或与Java-8(集成了Joda-Time概念)
Instant start, end;// Duration dur = Duration.between(start, stop); long hours = dur.toHours(); long minutes = dur.toMinutes();
这就是Java 8中如何解决问题,就像shamimz的回答一样。
来源: http : //docs.oracle.com/javase/tutorial/datetime/iso/period.html
LocalDate today = LocalDate.now(); LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1); Period p = Period.between(birthday, today); long p2 = ChronoUnit.DAYS.between(birthday, today); System.out.println("You are " + p.getYears() + " years, " + p.getMonths() + " months, and " + p.getDays() + " days old. (" + p2 + " days total)");
该代码产生类似于以下内容的输出:
You are 53 years, 4 months, and 29 days old. (19508 days total)
我们必须使用LocalDateTime http://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html获取小时,分钟和秒钟的差异。;
正如Michael Borgwardt在他的回答中所写的那样:
int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) / (1000 * 60 * 60 * 24) )
请注意,这与UTCdate一起使用,所以如果您查看当地date,差异可能是一天rest。 要使用当地date正确工作,由于夏令时需要采用完全不同的方法。
Date d2 = new Date(); Date d1 = new Date(1384831803875l); long diff = d2.getTime() - d1.getTime(); long diffSeconds = diff / 1000 % 60; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000); int diffInDays = (int) diff / (1000 * 60 * 60 * 24); System.out.println(diffInDays+" days"); System.out.println(diffHours+" Hour"); System.out.println(diffMinutes+" min"); System.out.println(diffSeconds+" sec");
你可以创build一个类似的方法
public long getDaysBetweenDates(Date d1, Date d2){ return TimeUnit.MILLISECONDS.toDays(d1.getTime() - d2.getTime()); }
此方法将返回两天之间的天数。
在Java 8中,可以使用DateTimeFormatter
, Duration
和LocalDateTime
。 这里是一个例子:
final String dateStart = "11/03/14 09:29:58"; final String dateStop = "11/03/14 09:33:43"; final DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendValue(ChronoField.MONTH_OF_YEAR, 2) .appendLiteral('/') .appendValue(ChronoField.DAY_OF_MONTH, 2) .appendLiteral('/') .appendValueReduced(ChronoField.YEAR, 2, 2, 2000) .appendLiteral(' ') .appendValue(ChronoField.HOUR_OF_DAY, 2) .appendLiteral(':') .appendValue(ChronoField.MINUTE_OF_HOUR, 2) .appendLiteral(':') .appendValue(ChronoField.SECOND_OF_MINUTE, 2) .toFormatter(); final LocalDateTime start = LocalDateTime.parse(dateStart, formatter); final LocalDateTime stop = LocalDateTime.parse(dateStop, formatter); final Duration between = Duration.between(start, stop); System.out.println(start); System.out.println(stop); System.out.println(formatter.format(start)); System.out.println(formatter.format(stop)); System.out.println(between); System.out.println(between.get(ChronoUnit.SECONDS));
这是代码:
String date1 = "07/15/2013"; String time1 = "11:00:01"; String date2 = "07/16/2013"; String time2 = "22:15:10"; String format = "MM/dd/yyyy HH:mm:ss"; SimpleDateFormat sdf = new SimpleDateFormat(format); Date fromDate = sdf.parse(date1 + " " + time1); Date toDate = sdf.parse(date2 + " " + time2); long diff = toDate.getTime() - fromDate.getTime(); String dateFormat="duration: "; int diffDays = (int) (diff / (24 * 60 * 60 * 1000)); if(diffDays>0){ dateFormat+=diffDays+" day "; } diff -= diffDays * (24 * 60 * 60 * 1000); int diffhours = (int) (diff / (60 * 60 * 1000)); if(diffhours>0){ dateFormat+=diffhours+" hour "; } diff -= diffhours * (60 * 60 * 1000); int diffmin = (int) (diff / (60 * 1000)); if(diffmin>0){ dateFormat+=diffmin+" min "; } diff -= diffmin * (60 * 1000); int diffsec = (int) (diff / (1000)); if(diffsec>0){ dateFormat+=diffsec+" sec"; } System.out.println(dateFormat);
出来的是:
duration: 1 day 11 hour 15 min 9 sec
这是我写的一个程序,它获得了两个date之间的天数(这里没有时间)。
import java.util.Scanner; public class HelloWorld { public static void main(String args[]) { Scanner s = new Scanner(System.in); System.out.print("Enter starting date separated by dots: "); String inp1 = s.nextLine(); System.out.print("Enter ending date separated by dots: "); String inp2 = s.nextLine(); int[] nodim = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; String[] inpArr1 = split(inp1); String[] inpArr2 = split(inp2); int d1 = Integer.parseInt(inpArr1[0]); int m1 = Integer.parseInt(inpArr1[1]); int y1 = Integer.parseInt(inpArr1[2]); int d2 = Integer.parseInt(inpArr2[0]); int m2 = Integer.parseInt(inpArr2[1]); int y2 = Integer.parseInt(inpArr2[2]); if (y1 % 4 == 0) nodim[2] = 29; int diff = m1 == m2 && y1 == y2 ? d2 - (d1 - 1) : (nodim[m1] - (d1 - 1)); int mm1 = m1 + 1, mm2 = m2 - 1, yy1 = y1, yy2 = y2; for (; yy1 <= yy2; yy1++, mm1 = 1) { mm2 = yy1 == yy2 ? (m2 - 1) : 12; if (yy1 % 4 == 0) nodim[2] = 29; else nodim[2] = 28; if (mm2 == 0) { mm2 = 12; yy2 = yy2 - 1; } for (; mm1 <= mm2 && yy1 <= yy2; mm1++) diff = diff + nodim[mm1]; } System.out.print("No. of days from " + inp1 + " to " + inp2 + " is " + diff); } public static String[] split(String s) { String[] retval = { "", "", "" }; s = s + "."; s = s + " "; for (int i = 0; i <= 2; i++) { retval[i] = s.substring(0, s.indexOf(".")); s = s.substring((s.indexOf(".") + 1), s.length()); } return retval; } }
我最近用一个简单的方法解决了类似的问题。
public static void main(String[] args) throws IOException, ParseException { TimeZone utc = TimeZone.getTimeZone("UTC"); Calendar calendar = Calendar.getInstance(utc); Date until = calendar.getTime(); calendar.add(Calendar.DAY_OF_MONTH, -7); Date since = calendar.getTime(); long durationInSeconds = TimeUnit.MILLISECONDS.toSeconds(until.getTime() - since.getTime()); long SECONDS_IN_A_MINUTE = 60; long MINUTES_IN_AN_HOUR = 60; long HOURS_IN_A_DAY = 24; long DAYS_IN_A_MONTH = 30; long MONTHS_IN_A_YEAR = 12; long sec = (durationInSeconds >= SECONDS_IN_A_MINUTE) ? durationInSeconds % SECONDS_IN_A_MINUTE : durationInSeconds; long min = (durationInSeconds /= SECONDS_IN_A_MINUTE) >= MINUTES_IN_AN_HOUR ? durationInSeconds%MINUTES_IN_AN_HOUR : durationInSeconds; long hrs = (durationInSeconds /= MINUTES_IN_AN_HOUR) >= HOURS_IN_A_DAY ? durationInSeconds % HOURS_IN_A_DAY : durationInSeconds; long days = (durationInSeconds /= HOURS_IN_A_DAY) >= DAYS_IN_A_MONTH ? durationInSeconds % DAYS_IN_A_MONTH : durationInSeconds; long months = (durationInSeconds /=DAYS_IN_A_MONTH) >= MONTHS_IN_A_YEAR ? durationInSeconds % MONTHS_IN_A_YEAR : durationInSeconds; long years = (durationInSeconds /= MONTHS_IN_A_YEAR); String duration = getDuration(sec,min,hrs,days,months,years); System.out.println(duration); } private static String getDuration(long secs, long mins, long hrs, long days, long months, long years) { StringBuffer sb = new StringBuffer(); String EMPTY_STRING = ""; sb.append(years > 0 ? years + (years > 1 ? " years " : " year "): EMPTY_STRING); sb.append(months > 0 ? months + (months > 1 ? " months " : " month "): EMPTY_STRING); sb.append(days > 0 ? days + (days > 1 ? " days " : " day "): EMPTY_STRING); sb.append(hrs > 0 ? hrs + (hrs > 1 ? " hours " : " hour "): EMPTY_STRING); sb.append(mins > 0 ? mins + (mins > 1 ? " mins " : " min "): EMPTY_STRING); sb.append(secs > 0 ? secs + (secs > 1 ? " secs " : " secs "): EMPTY_STRING); sb.append("ago"); return sb.toString(); }
并如预期的那样打印: 7 days ago
。
// calculating the difference b/w startDate and endDate String startDate = "01-01-2016"; String endDate = simpleDateFormat.format(currentDate); date1 = simpleDateFormat.parse(startDate); date2 = simpleDateFormat.parse(endDate); long getDiff = date2.getTime() - date1.getTime(); // using TimeUnit class from java.util.concurrent package long getDaysDiff = TimeUnit.MILLISECONDS.toDays(getDiff);
如何计算Java中两个date之间的差异