我有两个Date对象,我需要得到时间差,这样我就可以确定它们之间的总小时数。他们碰巧是在同一天。我想要的结果是小时和分钟。
当我在我的Date对象上使用.toString()时,我得到了这个:Fri Dec 18 08:08:10 CST 2009
我尝试了以下内容:
long diff=(this.endDate.getTime()-this.startDate.getTime())/(60*60 * 1000);
但这只给我几小时,而不是分钟。 我知道这是一个简单的问题,但我无法理解它。
编辑: 有兴趣的人的最终解决方案感谢Michael Brewer-Davis
Period p = new Period(this.startDate, this.endDate);
long hours = p.getHours();
long minutes = p.getMinutes();
String format = String.format("%%0%dd", 2);
return Long.toString(hours)+":"+String.format(format, minutes);
答案 0 :(得分:64)
这应该有用。
long secs = (this.endDate.getTime() - this.startDate.getTime()) / 1000;
int hours = secs / 3600;
secs = secs % 3600;
int mins = secs / 60;
secs = secs % 60;
答案 1 :(得分:60)
以下是Joda time:
的工作原理DateTime startTime, endTime;
Period p = new Period(startTime, endTime);
int hours = p.getHours();
int minutes = p.getMinutes();
您可以使用Joda的格式化程序格式化,例如PeriodFormat,但我建议使用Java。有关详细信息,请参阅this question。
答案 2 :(得分:10)
这是一个简单的方法:
private static int hoursDifference(Date date1, Date date2) {
final int MILLI_TO_HOUR = 1000 * 60 * 60;
return (int) (date1.getTime() - date2.getTime()) / MILLI_TO_HOUR;
}
答案 3 :(得分:2)
请在评论中遵循Somaiah的建议,改为使用小时:
小时小时= Hours.hoursBetween(startTime,endTime);
对getHours()的调用只返回时差的小时部分,并忽略所有年,月差异,因此在某些情况下不正确。
如果您使用Period.toStandardHours()尝试将时差转换为小时,如果两个日期之间的时差包括年或月的差异,则计算将引发异常,因为月长未知。
答案 4 :(得分:1)
我想贡献现代的答案。使用Joda-Time的解决方案很好。 Joda-Time项目处于维护模式,因此对于新代码,我们不应使用它。我遵循Joda-Time项目的官方建议,并使用java.time(现代Java日期和时间API):
Duration dur = Duration.between(startDate, endDate);
String result = String.format("%d:%02d", dur.toHours(), dur.toMinutesPart());
System.out.println(result);
如果startDate
和endDate
都具有类型Instant
或OffsetDateTime
或ZonedDateTime
或LocalDateTime
或LocalTime
,则此方法有效。所有提到的类型均来自java.time
包。如果以LocalDate
开头,请调用atStartOfDay
方法之一。
toMinutesPart
是在Java 9中引入的。如果您正在使用Java 8(otTenTen Backport),请搜索java format duration
或类似内容以学习如何将持续时间格式化为小时和分钟。 / p>
Joda-Time主页上的两句话:
现在要求用户迁移到
java.time
(JSR-310)。请注意,Joda-Time被认为是很大程度上“完成”的项目。 没有计划进行重大增强。如果使用Java SE 8,请迁移 到
java.time
(JSR-310)。
答案 5 :(得分:0)
因此,我假设getTime()方法返回一个整数。
在这种情况下,左括号组的类型为int,right?
和
(60*60*1000)
也是一个int。
这意味着你得到很长的diff =((int)/(int))所以整数除法是在你把东西转换为long之前完成的。因此你会失去你的会议记录。
在你分手之前尝试施放它们。
答案 6 :(得分:0)
对于Kotlin,您可以使用以下功能并获取两个日期之间的小时数
private val dateFormat: String = "yyyy-MM-dd @ hh:mm a"
val startDate = SimpleDateFormat(dateFormat).parse("2018-10-01 @ 12:33 PM")
val endDate = SimpleDateFormat(dateFormat).parse("2018-10-01 @ 02:46 PM")
private fun hoursDifference(date1: Date, date2: Date): Int {
val milliToHour : Long = 1000 * 60 * 60
return ((date1.time - date2.time) / milliToHour).toInt()
}
println(hoursDifference(endDate,startDate).toString())
输出: 2
答案 7 :(得分:0)
即使已经有一个公认的答案,这也是使用Joda time库对我有用的。
/**
*
* @param date1
* @param date2
* @return hours between two dates rounded down
*/
public static int hoursBetween(DateTime date1, DateTime date2) {
if(date1 == null || date2 == null) return NOT_FOUND;
return Math.abs(Hours.hoursBetween(date1.toLocalDateTime(), date2.toLocalDateTime()).getHours());
}
答案 8 :(得分:0)
private void getHours(Date d1, Date d2){
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffDays = diff / (24 * 60 * 60 * 1000);
long diffHours = diff / (60 * 60 * 1000) % 24;
System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.\n");
}`
//显示: / * 1天1小时1分钟50秒。 * /
答案 9 :(得分:0)
这是不涉及Joda或数学运算的纯Java 8+解决方案
import java.time.*;
import java.time.temporal.*;
// given two java.util.Dates
Date startDate ...
Date endDate ...
// convert them to ZonedDateTime instances
ZonedDateTime start = ZonedDateTime.ofInstant(startDate.toInstant(), ZoneId.systemDefault());
ZonedDateTime end = ZonedDateTime.ofInstant(endDate.toInstant(), ZoneId.systemDefault());
// get the total duration of minutes between them
Duration total = Duration.ofMinutes(ChronoUnit.MINUTES.between(start, end));
// use the duration to determine the hours and minutes values
long hours = total.toHours();
long minutes = total.minusHours(hours).toMinutes();
答案 10 :(得分:-2)
这是一个简单的方法: -
检查您的Date format
,如果您的日期不是这种格式,那么请更改它并转到此方法,它将为您提供String
,这是您的结果。根据要求修改方法。
private String getDateAsTime(String datePrev) {
String daysAsTime = "";
long day = 0, diff = 0;
String outputPattern = "yyyy:MM:dd HH:mm:ss";
SimpleDateFormat outputFormat = new SimpleDateFormat(outputPattern);
Calendar c = Calendar.getInstance();
String dateCurrent = outputFormat.format(c.getTime());
try {
Date date1 = outputFormat.parse(datePrev);
Date date2 = outputFormat.parse(dateCurrent);
diff = date2.getTime() - date1.getTime();
day = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
} catch (ParseException e) {
e.printStackTrace();
}
if (day == 0) {
long hour = TimeUnit.HOURS.convert(diff, TimeUnit.MILLISECONDS);
if (hour == 0)
daysAsTime = String.valueOf(TimeUnit.MINUTES.convert(diff, TimeUnit.MILLISECONDS)).concat(" minutes ago");
else
daysAsTime = String.valueOf(hour).concat(" hours ago");
} else {
daysAsTime = String.valueOf(day).concat(" days ago");
}
return daysAsTime;
}
希望这会有所帮助,