添加时间不会加起来

时间:2018-04-23 08:30:52

标签: java date time simpledateformat

很抱歉,但我找到了一个应该已经回答的问题。唉,我的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";
}   

我真诚地为我称之为代码的混乱道歉。让我知道如果以秒或毫秒计算是要走的路。在尝试这种方式时,我可能忽略了一些东西。

2 个答案:

答案 0 :(得分:2)

对于处理getTime()返回的时间值以毫秒为单位的事实,你的数学运算是错误的。

我猜测(因为上面的任何地方都没有显示),HOURSMINUTES分别是一小时和一分钟内的毫秒数的常数?如果是这样,你只是部分地处理单位是毫秒的事实,因为当你这样做时:

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;相同,但是你没有使用后一个减法的结果,所以这个错误没有显示。)

问题:我可以在Android上使用java.time吗?

是的,java.time适用于较旧和较新的Android设备。它只需要至少Java 6

  • 在Java 8及更高版本和更新的Android设备上(来自API级别26,我被告知)现代API内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接