Java中的日期总是1小时?

时间:2014-02-06 14:15:44

标签: java android time

我目前正在尝试实现以下目的:

  • 我正在创建一个Android应用程序,以帮助我管理工作中的rotas。在业余时间更多的项目,然后真正帮助。
  • 对于每位员工,我可以按以下格式将开始和结束时间设置为字符串:“HH:mm”。
  • 我需要计算总时数,然后算出包括休息时间在内的总时数。
  • 下面,如果有人工作超过3小时45分钟但不到6小时,我希望他们休息15分钟。
  • 例如,如果有人工作4小时(总时间04:00),他们将获得15分钟休息时间(包括休息时间03:45)。

问题:目前,如果我将时间设定为从06:00开始并在10:00结束,我希望它将总时数视为4小时,包括3小时45分钟的休息时间。它实际上给了我5小时和5小时45分钟的总小时数。

private String calcDiffInHoursAsString(Date start, Date finish){
    try{
        DateFormat formatter = new SimpleDateFormat("HH:mm");

        long diffInMillis =    finish.getTime() - start.getTime();
        Date diffAsDate = new Date(diffInMillis);
        String diffAsHours = formatter.format(diffAsDate);

        return diffAsHours;
    }catch(Exception ex){
        return "";
    }
}

private Date calcDiffInHoursAsDate(Date start, Date finish){
    try{
        DateFormat formatter = new SimpleDateFormat("HH:mm");

        long diffInMillis =    finish.getTime() - start.getTime();
        Date diffAsDate = new Date(diffInMillis);

        return diffAsDate;
    }catch(Exception ex){
        return new Date();
    }
}

private String calcHoursToString(String start, String finish){
    if (!(start == "00:00" && finish == "00:00")){

        try{
            DateFormat formatter = new SimpleDateFormat("HH:mm");
            Date startTime = formatter.parse(start);
            Date finishTime = formatter.parse(finish);

            Date HoursExcBreaks = calcDiffInHoursAsDate(startTime, finishTime);
            String HoursExcBreaksAsString = calcDiffInHoursAsString(startTime, finishTime);
            Log.d("Difference exc. Breaks", HoursExcBreaksAsString);

            // Breaks:
            // < 4 hours - No Break
            // 4 - 6 hours - 15 Minutes
            // 6 - 8 hours - 30 Minutes
            // 8 - 9 hours - 45 Minutes

            // Work out actual hours after breaks

            // If HoursExcBreaks > 03:45 and HoursExcBreaks < 06:00 then take 00:15 break...
            if (HoursExcBreaks.before(formatter.parse("06:00")) && HoursExcBreaks.after(formatter.parse("03:45"))){
                long millisecondsIncBreak = HoursExcBreaks.getTime() - formatter.parse("00:15").getTime();
                Date dateIncBreak = new Date(millisecondsIncBreak);
                String hoursIncBreak = formatter.format(dateIncBreak);

                Log.d("Shift Inc Breaks", hoursIncBreak );
            }


        }catch(Exception ex){
            Context context = getActivity();
            CharSequence text = ex.getMessage();
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }

    }

    return "";
}

所以当我打电话时:

calcHoursToString("06:00", "10:00" );

我得到的换档长度包括03:45中断的字符串。

事实是,我甚至不确定这是解决这个问题的最好方法吗?可能不是! :)

3 个答案:

答案 0 :(得分:2)

你的问题在这里:

long diffInMillis = finish.getTime() - start.getTime();
Date diffAsDate = new Date(diffInMillis);

您使用java.util.Date来表示持续时间,而不是绝对时间点,这将导致各种问题。具体来说,在这种情况下,当您执行新的Date(diffInMillies)时,diffInMillis将在UTC的上下文中进行解释,这可能不是您所在的时区...

不要使用日期来表示持续时间!只需将其保留为int或long等基本类型,即毫秒数。

如果您想要很好地格式化持续时间,您必须手动执行此操作,或者如其他人所指出的那样,您可以使用JODA这样的框架,该框架内置了持续时间类。

答案 1 :(得分:1)

亚历,

用于评估日期差异的最佳框架之一是JODA

例如

Hours.between(startDate, endDate);

答案 2 :(得分:0)

您没有考虑时区...一旦开始进行日期转换(将长时间值转换为日期),您需要考虑时区。如果你在同一个TimeZone上没有设置的2个日期之间做了一些区别,那么这就是可能发生的事情。