【发布时间】:2018-04-23 08:30:52
【问题描述】:
对不起,我来找你的问题应该已经回答了。唉,我的 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";
}
我对我的代码造成的混乱表示诚挚的歉意。让我知道是否按秒或毫秒计算是要走的路。我在尝试这种方式时可能忽略了一些东西。
2020 年更新:
我想更新我的代码以及我应该做的事情。首先,我应该更多地分离单元格、字符串和时间。其次,为了清楚起见,我应该将其分解为更多方法。
我将只显示 getTotalHours(startTimeString, endTimeString):
DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");
LocalTime end = LocalTime.parse(endTimeString.trim(), format);
LocalTime start = LocalTime.parse(startTimeString.trim(), format);
return Duration.between(start, end).toHoursPart()%24
+ ":"
+ Duration.between(start, end).toMinutes()%60;
【问题讨论】:
-
为什么不使用
LocalTime或LocalDateTime? -
处理时间和日期的第一课:在任何情况下都不要自己计算。您会假设某些不正确的事情,例如所有分钟都有 60 秒。
-
避开
SimpleDateFormat和它的朋友们,这很麻烦,而且他们早就过时了。使用来自java.time(现代Java 日期和时间API)的Duration来处理时间量。 -
你的常量
HOURS和MINUTES,它们是怎么定义的?并不是说您应该自己声明这些常量,只是想了解更确切的问题所在。 -
@SeverityOne 我怎么能不假设所有分钟都有 60 秒?但是,是的,我尝试让我的 excel 表为我计算,但我在某处读到最好以编程方式完成。我知道我遗漏了一些东西:int SECONDS = 1000; int MINUTES = 60*SECONDS;整数小时 = 60*分钟;一旦我掌握了 LocalTime API,我将避免使用这些 API。
标签: java date time simpledateformat