如何在android中获得2次的差异

一箫一剑平生意,负尽狂名十五年。这篇文章主要讲述如何在android中获得2次的差异相关的知识,希望能为你提供帮助。
我想找出当前系统时间与插入数据和时间String之间的差异。我试过这个:

try {String strFileDate = "2012-04-19 15:15:00"; DateFormat formatter2 = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); Date date = formatter2.parse(strFileDate); long difference = date.getTime() - System.currentTimeMillis(); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(difference); Toast.makeText(getBaseContext(), formatter2.format(calendar.getTime()), Toast.LENGTH_LONG) .show(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }

但它没有给我正确的结果。我做得对吗?
更新我试着跟着::
String strFileDate = "2012-04-19 15:15:00"; DateFormat formatter2 = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); Date date = formatter2.parse(strFileDate); long diffInMs = date.getTime() - new Date(System.currentTimeMillis()).getTime(); long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMs); long hour = diffInSec / (1000 * 60 * 60); double minutes = diffInSec / (1000 * 60); // long diffInHour = TimeUnit.to(diffInMs); Toast.makeText(getBaseContext(), "left time is :: " + hour + ":" + minutes, Toast.LENGTH_LONG).show();

output :: left time是:: -2:-131.0
更新(20/4/2012)
try { Date dt = new Date(); String strFileDate = "2012-04-20 13:10:00"; DateFormat formatter2 = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); Date date = formatter2.parse(strFileDate); String s = getTimeDiff(dt, date); Log.i("Date is :: > > > ", s); } catch (Exception e) { e.printStackTrace(); } public String getTimeDiff(Date dateOne, Date dateTwo) { String diff = ""; long timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime()); diff = String.format("%d hour(s) %d min(s)", TimeUnit.MILLISECONDS.toHours(timeDiff), TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff))); return diff;

}
【如何在android中获得2次的差异】输出:: 04-20 12:48:06.629:信息/日期是:: > > > (1295):2183小时38分钟
答案使用JodaTime计算周期(时差)。 http://joda-time.sourceforge.net/
另一答案
String strFileDate = "2012-04-19 15:15:00"; DateFormat formatter2 = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); Date date = formatter2.parse(strFileDate); long diffInMs = date.getTime() - new Date(System.currentTimeMillis()).getTime(); long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMis); long diffInHour = TimeUnit.MILLISECONDS.toHours(diffInMis);

使用TimeUnit获取秒数。 http://developer.android.com/reference/java/util/concurrent/TimeUnit.html
编辑:
获取TIMEUNIT Code here
public String getTimeDiff(Date dateOne, Date dateTwo) { String diff = ""; long timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime()); diff = String.format("%d hour(s) %d min(s)", TimeUnit.MILLISECONDS.toHours(timeDiff), TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff))); return diff; }

另一答案
Calendar calendar = Calendar.getInstance(); calendar.setTime(date.getYear(),date.getMonth(),date.getDay(),date.getHourOFday(),date.getMinutes(),date.getSeconds); // not syntactically right.. long difference = System.currentTimeMillis()-calendar.getTimeInMillis();

并在小时内获得差异
double hour = difference/(1000*60*60); double minutes = difference/(1000*60);

另一答案
  • 你得到什么输出?
  • 你期望什么输出?
如果您在几秒钟内需要这个时间,请参阅#3960661。
另一答案 tl; dr
ChronoUnit.MINUTES.between( LocalDateTime.parse( "2012-04-19 15:15:00".replace( " " , "T" ) ).atZone( ZoneId.of( "Pacific/Auckland" ) ) , LocalDateTime.parse( "2012-04-19 23:49:00".replace( " " , "T" ) ).atZone( ZoneId.of( "Pacific/Auckland" ) ) )

514
Time zone您的代码忽略了时区的关键问题。
java.util.Date类代表UTC的一个时刻。同时,您的输入字符串“2012-04-19 15:15:00”缺少任何时区指示符或与UTC的偏移量。您必须将该值显式放入预期/所需区域/偏移的上下文中,否则这些遗留类将隐式应用区域/偏移。
java.time现代方法使用Java 8及更高版本中内置的java.time类。
您的输入几乎符合标准ISO 8601格式。切换中间的SPACE为T
String input = "2012-04-19 15:15:00".replace( " " , "T" ) ; // Convert to ISO 8601 format.

解析为LocalDateTime对象,因为您的输入缺少区域或偏移。
LocalDateTime ldt = LocalDateTime.parse( input ) ;

应用您知道的用于该输入的区域或偏移量。
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ; // Or some other offset.

…要么…
ZoneId z = ZoneId.of( "Africa/Tunis" ) ; ZonedDateTime zdt = ldt.atZone( z ) ;

如果您希望两个时刻之间的增量作为未连接到时间轴的时间跨度,缩放为小时 - 分钟 - 秒,则计算Duration
Duration d = Duration.between( start , stop ) ;

类似,但在几个月 - 几天缩放,使用Period。提取LocalDate仅限日期的对象以提供Period的工厂方法。
Period p = Period.between( start.toLocalDate() , stop.toLocalDate() ) ;

总逝去时间如果你想要一个经过的总分钟数,秒数等,请在ChronoUnit::between枚举上使用ChronoUnit方法。
long totalMinutes = ChronoUnit.MINUTES.between( start , stop ) ; // Calculate total number of minutes in entire span of time.

生成字符串在standard ISO 8601 format中生成一个字符串。只需致电Duration::toStringPeriod::toString
格式为PnYnMnDTnHnMnS,其中P标志着开头,而T将任何年 - 月 - 天与任何小时 - 分钟 - 秒分开。
String output = d.toString() ;

您可以通过调用各种getter方法来查询部件。
提示:如果您在这样的时间范围内工作很多,请将ThreeTen-Extra库添加到项目中以使用IntervalLocalDateRange类。
About java.timejava.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat
现在在Joda-Time的maintenance mode项目建议迁移到java.time班。
要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310。
您可以直接与数据库交换java.time对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。
从哪里获取java.time类?
  • Java SE 8,Java SE 9,以及之后 内置。 带有捆绑实现的标准Java API的一部分。 Java 9增加了一些小功能和修复。
  • Java SE 6和Java SE 7 大部分java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。
  • Android 更高版本的android捆绑java.time类的实现。 对于早期的Android,ThreeTenABP项目采用ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…
ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如Interval

    推荐阅读