Ale*_*ian 31 java time android date
我在这里看到了所有的帖子,但我仍然无法想象如何在两个android日期之间找到差异.
这就是我做的:
long diff = date1.getTime() - date2.getTime();
Date diffDate = new Date(diff);
Run Code Online (Sandbox Code Playgroud)
我明白了:日期是1970年1月1日,时间总是在两个小时内变大......我来自以色列所以两个小时就是时间.
我怎样才能得到正常的差异?
Dan*_*n F 86
你接近正确的答案,你得到这两个日期之间的毫秒差异,但是当你试图用这个差异构建一个日期时,它假设你想要创建一个Date具有该差异值的新对象作为其纪元时间.如果你正在寻找一个小时的时间,那么你只需要做一些基本的算术diff来获得不同的时间部分:
long diff = date1.getTime() - date2.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
Run Code Online (Sandbox Code Playgroud)
所有这些数学运算只会进行整数运算,因此会截断任何小数点
Dud*_*ude 33
long diffInMillisec = date1.getTime() - date2.getTime();
long diffInDays = TimeUnit.MILLISECONDS.toDays(diffInMillisec);
long diffInHours = TimeUnit.MILLISECONDS.toHours(diffInMillisec);
long diffInMin = TimeUnit.MILLISECONDS.toMinutes(diffInMillisec);
long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMillisec);
Run Code Online (Sandbox Code Playgroud)
Shi*_*din 17
一些补充: 这里我将字符串转换为日期然后我比较当前时间.
String toyBornTime = "2014-06-18 12:56:50";
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
try {
Date oldDate = dateFormat.parse(toyBornTime);
System.out.println(oldDate);
Date currentDate = new Date();
long diff = currentDate.getTime() - oldDate.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
if (oldDate.before(currentDate)) {
Log.e("oldDate", "is previous date");
Log.e("Difference: ", " seconds: " + seconds + " minutes: " + minutes
+ " hours: " + hours + " days: " + days);
}
// Log.e("toyBornTime", "" + toyBornTime);
} catch (ParseException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
使用java.time.Duration:
Duration diff = Duration.between(instant2, instant1);
System.out.println(diff);
Run Code Online (Sandbox Code Playgroud)
这将打印类似
PT109H27M21S
Run Code Online (Sandbox Code Playgroud)
这意味着一段 109 小时 27 分 21 秒的时间。如果你想要一些更易读的东西——我会先给出 Java 9 版本,它最简单:
String formattedDiff = String.format(Locale.ENGLISH,
"%d days %d hours %d minutes %d seconds",
diff.toDays(), diff.toHoursPart(), diff.toMinutesPart(), diff.toSecondsPart());
System.out.println(formattedDiff);
Run Code Online (Sandbox Code Playgroud)
现在我们得到
4 days 13 hours 27 minutes 21 seconds
Run Code Online (Sandbox Code Playgroud)
该Duration班是部分java.time现代Java的日期和时间API。这捆绑在较新的 Android 设备上。在较旧的设备上,获取 ThreeTenABP 并将其添加到您的项目中,并确保org.threeten.bp.Duration从同一包中导入您可能需要的其他日期时间类。
假设您还没有获得 Java 9 版本,您可以依次减去较大的单位以获得较小的单位:
long days = diff.toDays();
diff = diff.minusDays(days);
long hours = diff.toHours();
diff = diff.minusHours(hours);
long minutes = diff.toMinutes();
diff = diff.minusMinutes(minutes);
long seconds = diff.toSeconds();
Run Code Online (Sandbox Code Playgroud)
然后你可以像上面一样格式化四个变量。
ADate代表一个时间点。它从来就不是用来表示时间和持续时间的,它不适合它。试图使这项工作最多只会导致代码混乱且难以维护。你不想那样,所以请不要。
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少Java 6。
org.threeten.bp子包中导入日期和时间类。java.time.java.time向 Java 6 和 7的 backport小智 5
使用Instant怎么样:
val instant1 = now()
val instant2 = now()
val diff: Duration = Duration.between(instant1, instant2)
val minutes = diff.toMinutes()
Run Code Online (Sandbox Code Playgroud)
您甚至可以使用 instant1.toString() 保存 Instant 并使用 parse(string) 解析该字符串。
如果您需要支持 Android API 级别 < 26,只需 向您的项目添加Java 8+ API 脱糖支持即可。