Java 添加时间不会';不算
对不起,我带着一个应该已经回答的问题来找你。唉,我的google foo很弱,我谦卑地来寻求你的指导 为什么会出现额外的59分钟 好的,我得到了一个“时钟进入”的东西,我的计算出错了,当外出的人的分钟数与外出的人的分钟数相同时。我记得以前听说过这个问题,但没有解决办法。只是一句“好吧,就是这样。祝你好运,布拉。”我试着在计算过程中加减分钟,但这只会把问题推到加减时间上。我也试着计算第二个(下面没有显示),但这也没有帮助 这是我的代码:Java 添加时间不会';不算,java,date,time,simpledateformat,Java,Date,Time,Simpledateformat,对不起,我带着一个应该已经回答的问题来找你。唉,我的google foo很弱,我谦卑地来寻求你的指导 为什么会出现额外的59分钟 好的,我得到了一个“时钟进入”的东西,我的计算出错了,当外出的人的分钟数与外出的人的分钟数相同时。我记得以前听说过这个问题,但没有解决办法。只是一句“好吧,就是这样。祝你好运,布拉。”我试着在计算过程中加减分钟,但这只会把问题推到加减时间上。我也试着计算第二个(下面没有显示),但这也没有帮助 这是我的代码: //calculateTotalHours() publi
//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):
您的数学在处理
getTime()
返回的时间值以毫秒为单位这一事实时完全错了
我猜(因为上面没有显示,HOURS
和MINUTES
分别是一小时和一分钟内毫秒数的常数?如果是这样,您只是部分地处理了单位为毫秒的事实,因为当您这样做时:
totalTime -= diffHours;
…你将只从总时间中减去几毫秒,而不是实现我认为你正在实现的目标,也就是去掉所有的小时,剩下的是几分钟
这段代码还有其他问题,但这是最明显的问题
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中的Duration
中引入的toMinutesPart
方法。假设您使用的是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格式),因此它还避免了我们指定显式格式化程序
你的代码出了什么问题?
正如kshetline所说,我相信totalTime
以毫秒为单位,diffHours
以小时为单位。所以当你做totalTime-=diffHours代码>,从毫秒中减去小时,必然会得到错误的结果(顺便说一句,与totalTime-=diffMinutes;
相同,但您没有使用后一个减法的结果,因此不会显示此错误)
问题:我可以在Android上使用java.time吗?
是的,java.time
在较旧和较新的Android设备上运行良好。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(我听说是API级别26),现代API是内置的
- 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
- 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
org.threeten.bp
导入日期和时间类
链接
- 解释如何使用
java.time
- ,其中首先描述了
java.time
- ,java.time的后端口
到Java6和Java7(JSR-310为三十)
为什么不使用
LocalTime
或LocalDateTime
?处理时间和日期的第一课:在任何情况下都不要自己计算。你可能会假设某些事情是不正确的,例如所有分钟都有60秒。避免使用SimpleDateFormat
及其朋友,这很麻烦,而且它们早已过时。使用java.time
(现代java日期和时间API)中的Duration
来处理时间量。您的常量HOURS
和MINUTES
,它们是如何定义的?并不是说你应该自己声明这样的常数,只是想弄清楚到底出了什么问题。@SeverityOne我怎么能不假设所有的分钟都有60秒呢??但是,是的,我试着让我的excel表格为我做计算,但我在某个地方读到,最好用编程的方式完成。我知道我遗漏了什么:int秒=1000;整数分钟=60*秒;整小时=60*分钟;一旦我掌握了LocalTime API,我就会避免使用这些API。这是一个巨大的疏忽。很抱歉。我认为我正确地遵循了一个示例,但再次检查,我发现它错在哪里了。下面是另一个代码@OleV.V展示了一个关于如何使用LocalTime而不是SimpleDataFormat的示例。另一位用户还建议切换到该API和LocalDateTime。我会一直这么做直到我想再把我的头撞到墙上。谢谢
long hours = worked.toHours();
long minutes = worked.minusHours(hours).toMinutes();
return String.format("%02d:%02d", hours, minutes);