很抱歉,但我找到了一个应该已经回答的问题。唉,我的google-foo很弱,我谦卑地请求你的指导。
为什么额外出现59分钟?
好的,所以我得到了一个“时钟输入”的东西,当人们的分钟数与分钟数相同时,我的计算出错了。我记得以前听过这个问题,但没有解决方案。只是一个“好吧,就是这样。好运,好吧。”我已经尝试在计算过程中添加和减去分钟,但这只是推动了问题+/-添加/减去的时间。我也试过计算到第二个(未在下面显示),但这也没有帮助。
强制性,这是我的代码:
//calculateTotalHours()
public static String calculateTotalHours(Cell inTime, Cell outTime, Cell breakStart, Cell breakEnd)
{
System.out.println(LOG + "calculateTotalHours");
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
Date in, out, start, end;
if(null != inTime && null != outTime && null != breakStart && null != breakEnd)
{
try
{
in = timeFormat.parse(inTime.getStringCellValue());
out = timeFormat.parse(outTime.getStringCellValue());
start = timeFormat.parse(breakStart.getStringCellValue());
end = timeFormat.parse(breakEnd.getStringCellValue());
long lunchTotal = end.getTime() - start.getTime();
long totalWork = out.getTime() - in.getTime();
long totalTime = totalWork - lunchTotal;
long diffHours = totalTime/HOURS % 24;
totalTime -= diffHours;
long diffMinutes = totalTime/MINUTES % 60;
totalTime -= diffMinutes;
return String.format("%02d:%02d", diffHours, diffMinutes);
}
catch (ParseException e) {e.printStackTrace();}
}
else
{
try
{
if(null == breakStart || null == breakEnd) {
in = timeFormat.parse(inTime.getStringCellValue());
out = timeFormat.parse(outTime.getStringCellValue());
long totalTime = out.getTime() - in.getTime();
long diffHours = totalTime/HOURS % 24;
totalTime -= diffHours;
long diffMinutes = totalTime/MINUTES % 60;
totalTime -= diffMinutes;
return String.format("%02d:%02d", diffHours, diffMinutes);
}
else if(null == inTime.getStringCellValue())
{
System.out.println(LOG + "inTime is blank");
return "-1";
}
}
catch (ParseException e) {e.printStackTrace();}
}
return "-1";
}
我真诚地为我称之为代码的混乱道歉。让我知道如果以秒或毫秒计算是要走的路。在尝试这种方式时,我可能忽略了一些东西。
答案 0 :(得分:2)
对于处理getTime()
返回的时间值以毫秒为单位的事实,你的数学运算是错误的。
我猜测(因为上面的任何地方都没有显示),HOURS
和MINUTES
分别是一小时和一分钟内的毫秒数的常数?如果是这样,你只是部分地处理单位是毫秒的事实,因为当你这样做时:
totalTime -= diffHours;
...你只需要减去总时间的几毫秒,而不是达到我认为你认为自己正在完成的任务,这样就可以消除所有的时间,这样才能实现目标。左边是分钟。
此代码还存在其他问题,但这是最明显的问题。
答案 1 :(得分:0)
private static final String defaultHours = "-1";
public static String calculateTotalHours(Cell inTime, Cell outTime, Cell breakStart, Cell breakEnd)
{
try {
LocalTime inLocalTime = LocalTime.parse(inTime.getStringCellValue());
LocalTime outLocalTime = LocalTime.parse(outTime.getStringCellValue());
LocalTime breakStartTime = LocalTime.parse(breakStart.getStringCellValue());
LocalTime breakEndTime = LocalTime.parse(breakEnd.getStringCellValue());
Duration lunch = Duration.between(breakStartTime, breakEndTime);
Duration present = Duration.between(inLocalTime, outLocalTime);
Duration worked = present.minus(lunch);
return String.format("%02d:%02d", worked.toHours(), worked.toMinutesPart());
} catch (DateTimeParseException dtpe) {
System.out.println(dtpe);
return defaultHours;
}
}
上面的代码使用了Java 9中toMinutesPart
中引入的Duration
方法。假设您使用的是ThreeTenABP(详情如下)或早期的Java版本,那就是:
long hours = worked.toHours();
long minutes = worked.minusHours(hours).toMinutes();
return String.format("%02d:%02d", hours, minutes);
为清楚起见,我省略了空检查,我相信你可以处理这些。
如评论中所述,将时间数学留给经过充分测试的库方法。它不仅容易出错,还能提供更清晰的代码。我正在使用java.time
,现代Java日期和时间API。它还使我们免于指定显式格式化程序,因为LocalTime.parse()
将HH:mm
的格式解析为默认格式(ISO 8601格式)。
作为the other answer中的kshetline,我认为totalTime
以毫秒为单位,diffHours
为小时。所以,当你执行totalTime -= diffHours;
时,你会从毫秒减去小时数而且你必然会得到一个不正确的结果(顺便说一下,与totalTime -= diffMinutes;
相同,但是你没有使用后一个减法的结果,所以这个错误没有显示。)
是的,java.time
适用于较旧和较新的Android设备。它只需要至少Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。