Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 添加时间不会';不算_Java_Date_Time_Simpledateformat - Fatal编程技术网

Java 添加时间不会';不算

Java 添加时间不会';不算,java,date,time,simpledateformat,Java,Date,Time,Simpledateformat,对不起,我带着一个应该已经回答的问题来找你。唉,我的google foo很弱,我谦卑地来寻求你的指导 为什么会出现额外的59分钟 好的,我得到了一个“时钟进入”的东西,我的计算出错了,当外出的人的分钟数与外出的人的分钟数相同时。我记得以前听说过这个问题,但没有解决办法。只是一句“好吧,就是这样。祝你好运,布拉。”我试着在计算过程中加减分钟,但这只会把问题推到加减时间上。我也试着计算第二个(下面没有显示),但这也没有帮助 这是我的代码: //calculateTotalHours() publi

对不起,我带着一个应该已经回答的问题来找你。唉,我的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):


您的数学在处理
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为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

  • 为什么不使用
    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);