计算差异。 两次之间我们有两个不同的时间和日期字符串
我有时间数据分为两个字符串 – 一个字符串表示日期,一个字符串表示时间。
我想计算差异。 在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.Date
和java.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/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用3-4字母缩写,例如EST
或IST
因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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格式生成持续时间的字符串: PnYnMnDTnHnMnS
。 P
标记开始,而T
标记两个部分。
String output = d.toString();
d.toString():PT13H15M
在Java 9及更高版本中,调用to…Part
方法来访问每个组件。
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8和SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参阅如何使用….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。