计算差异。 两次之间我们有两个不同的时间和日期字符串

我有时间数据分为两个字符串 – 一个字符串表示日期,一个字符串表示时间。
我想计算差异。 在Java中这样两次。
例如

  • 时间1:“26/02/2011”和“上午11:00”
  • 时间2:“27/02/2011”和“12:15 AM”

差异将是13小时15分钟。

String str_date1 = "26/02/2011"; String str_time1 = "11:00 AM"; String str_date2 = "27/02/2011"; String str_time2 = "12:15 AM" ; DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm a"); Date date1 = formatter.parse(str_date1 + " " + str_time1); Date date2 = formatter.parse(str_date2 + " " + str_time2); // Get msec from each, and subtract. long diff = date2.getTime() - date1.getTime(); System.out.println("Difference In Days: " + (diff / (1000 * 60 * 60 * 24))); 

Obs:这仅作为aproximation有效。 看看花园小径上的失去时间 。)

 try { String date1 = "26/02/2011"; String time1 = "11:00 AM"; String date2 = "27/02/2011"; String time2 = "12:15 AM"; String format = "dd/MM/yyyy hh:mm a"; SimpleDateFormat sdf = new SimpleDateFormat(format); Date dateObj1 = sdf.parse(date1 + " " + time1); Date dateObj2 = sdf.parse(date2 + " " + time2); System.out.println(dateObj1); System.out.println(dateObj2); long diff = dateObj2.getTime() - dateObj1.getTime(); double diffInHours = diff / ((double) 1000 * 60 * 60); System.out.println(diffInHours); System.out.println("Hours " + (int)diffInHours); System.out.println("Minutes " + (diffInHours - (int)diffInHours)*60 ); } catch (ParseException e) { e.printStackTrace(); } 

产量

 Sat Feb 26 11:00:00 EST 2011 Sun Feb 27 00:15:00 EST 2011 13.25 Hours 13 Minutes 15.0 

您需要先将字符串转换为java.util.Date对象(例如,使用SimpleDateFormat.parse(String) )。 然后,您可以对解析的两个Date实例中的每一个使用Date.getTime() ,并以毫秒为单位计算差异,或者使用java.util.Calendar或joda time API进行高级计算。

看看DateFormat ,你可以使用它来解析你的字符串,使用parse(String source)方法,你可以轻松地操作两个Dates对象来获得你想要的东西。

 DateFormat df = DateFormat.getInstance(); Date date1 = df.parse(string1); Date date2 = df.parse(string2); long difference = date1.getTime() - date2.getTime(); Date myDate = new Date(difference); 

显示日期:

 String diff = df.format(myDate); 

试试这个

你可以计算天,小时和分钟

 public class TimeUtils { public static final String HOURS = "hours"; public static final String MINUTES = "minutes"; public static final String DAYS = "days"; public static int findTheNumberBetween(String type, Date day1, Date day2) { long diff = day2.getTime() - day1.getTime(); switch (type) { case DAYS: return (int) TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); case HOURS: return (int) TimeUnit.HOURS.convert(diff, TimeUnit.MILLISECONDS); case MINUTES: return (int) TimeUnit.MINUTES.convert(diff, TimeUnit.MILLISECONDS); } return 0; } } 

并使用它

  Date day1= TimeUtils.getDateTime("2016-12-08 02:06:14"); Date day2 = TimeUtils.getDateTime("2016-12-08 02:10:14"); Log.d(TAG, "The difference: "+TimeUtils.findTheNumberBetween(TimeUtils.MINUTES,day1,day2)); 

TL;博士

 Duration.between( ZonedDateTime.of( LocalDate.parse( "26/02/2011" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) , LocalTime.parse( "11:00 AM" , DateTimeFormatter.ofPattern( "hh:mm a" ) ) , ZoneId.of( "America/Montreal" ) ) , ZonedDateTime.of( LocalDate.parse( "27/02/2011" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) , LocalTime.parse( "12:15 AM" , DateTimeFormatter.ofPattern( "hh:mm a" ) ) , ZoneId.of( "America/Montreal" ) ) ).toString() 

查看IdeOne.com中的实时代码 。

时区

问题和其他答案都忽略了时区的关键问题。 如果不知道预期的时区,则无法计算两个日期时间字符串之间的经过时间。 例如,在夏令时(DST)的地方,在切换的当晚,一天可能是23小时长或25小时长而不是24小时长。

java.time

使用java.time类进行日期时间工作的现代方法。 这些取代了麻烦的旧日期时间类,如java.util.Datejava.util.Calendar

Local…

首先解析输入字符串。 这些没有任何时区指示,因此我们将它们解析为Local…类型。

定义DateTimeFormatter以匹配您的字符串输入。 顺便说一下,将来,在将日期时间值序列化为文本时,请使用标准ISO 8601格式。

 DateTimeFormatter df = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ); LocalDate ld = LocalDate.parse( "26/02/2011" , df ) ; 

ld.toString():2011-02-2011

 DateTimeFormatter tf = DateTimeFormatter.ofPattern( "hh:mm a" ); LocalTime lt = LocalTime.parse( "11:00 AM" , tf ) ; 

lt.toString():11:00:00

ZoneId

您需要知道业务场景所针对的时区。 我会任意选择一个。

continent/region的格式指定适当的时区名称 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 。 切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

 ZoneId z = ZoneId.of( "America/Montreal" ); 

ZonedDateTime

应用区域以获取ZonedDateTime

 ZonedDateTime zdtStart = ZonedDateTime.of( ld , lt , z ); 

zdtStart.toString():2011-02-26T11:00:00-05:00 [美国/蒙特利尔]

Duration

做同样的zdtStop来获得zdtStop 。 在“持续时间”中将经过时间计算为未附加到时间轴的时间跨度。

 Duration d = Duration.between( zdtStart , zdtStop ); 

调用toString以标准ISO 8601格式生成持续时间的字符串: PnYnMnDTnHnMnSP标记开始,而T标记两个部分。

 String output = d.toString(); 

d.toString():PT13H15M

在Java 9及更高版本中,调用to…Part方法来访问每个组件。


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参阅如何使用….

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