我目前正在尝试实现以下目的:
问题:目前,如果我将时间设定为从06:00开始并在10:00结束,我希望它将总时数视为4小时,包括3小时45分钟的休息时间。它实际上给了我5小时和5小时45分钟的总小时数。
private String calcDiffInHoursAsString(Date start, Date finish){
try{
DateFormat formatter = new SimpleDateFormat("HH:mm");
long diffInMillis = finish.getTime() - start.getTime();
Date diffAsDate = new Date(diffInMillis);
String diffAsHours = formatter.format(diffAsDate);
return diffAsHours;
}catch(Exception ex){
return "";
}
}
private Date calcDiffInHoursAsDate(Date start, Date finish){
try{
DateFormat formatter = new SimpleDateFormat("HH:mm");
long diffInMillis = finish.getTime() - start.getTime();
Date diffAsDate = new Date(diffInMillis);
return diffAsDate;
}catch(Exception ex){
return new Date();
}
}
private String calcHoursToString(String start, String finish){
if (!(start == "00:00" && finish == "00:00")){
try{
DateFormat formatter = new SimpleDateFormat("HH:mm");
Date startTime = formatter.parse(start);
Date finishTime = formatter.parse(finish);
Date HoursExcBreaks = calcDiffInHoursAsDate(startTime, finishTime);
String HoursExcBreaksAsString = calcDiffInHoursAsString(startTime, finishTime);
Log.d("Difference exc. Breaks", HoursExcBreaksAsString);
// Breaks:
// < 4 hours - No Break
// 4 - 6 hours - 15 Minutes
// 6 - 8 hours - 30 Minutes
// 8 - 9 hours - 45 Minutes
// Work out actual hours after breaks
// If HoursExcBreaks > 03:45 and HoursExcBreaks < 06:00 then take 00:15 break...
if (HoursExcBreaks.before(formatter.parse("06:00")) && HoursExcBreaks.after(formatter.parse("03:45"))){
long millisecondsIncBreak = HoursExcBreaks.getTime() - formatter.parse("00:15").getTime();
Date dateIncBreak = new Date(millisecondsIncBreak);
String hoursIncBreak = formatter.format(dateIncBreak);
Log.d("Shift Inc Breaks", hoursIncBreak );
}
}catch(Exception ex){
Context context = getActivity();
CharSequence text = ex.getMessage();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
}
return "";
}
所以当我打电话时:
calcHoursToString("06:00", "10:00" );
我得到的换档长度包括03:45中断的字符串。
事实是,我甚至不确定这是解决这个问题的最好方法吗?可能不是! :)
答案 0 :(得分:2)
你的问题在这里:
long diffInMillis = finish.getTime() - start.getTime();
Date diffAsDate = new Date(diffInMillis);
您使用java.util.Date来表示持续时间,而不是绝对时间点,这将导致各种问题。具体来说,在这种情况下,当您执行新的Date(diffInMillies)时,diffInMillis将在UTC的上下文中进行解释,这可能不是您所在的时区...
不要使用日期来表示持续时间!只需将其保留为int或long等基本类型,即毫秒数。
如果您想要很好地格式化持续时间,您必须手动执行此操作,或者如其他人所指出的那样,您可以使用JODA这样的框架,该框架内置了持续时间类。
答案 1 :(得分:1)
答案 2 :(得分:0)
您没有考虑时区...一旦开始进行日期转换(将长时间值转换为日期),您需要考虑时区。如果你在同一个TimeZone上没有设置的2个日期之间做了一些区别,那么这就是可能发生的事情。