首页 > 解决方案 > 如何计算浮点值并将其拆分为两个单独的整数值?例如 18.5f 小时等于 int h=18 int m=30

问题描述

我正在创建一个计算“开始”和“结束”日期的工作日日历程序

结果应输出:

“开始日期:24-05-2004 07:03 加上 8.276628 个工作日是结束日期:04-06-2004 10:12”

或者

24-05-2004 18:03 加上 -6.7470217 个工作日是 13-05-2004 10:02

数学解决方案是将每天的小时数与 incrementInWokringdays 相乘,例如每天 8.0f 小时 * 2.5f 天 = 18.4f 小时,然后应该以这种方式将结果添加到日期日历中

-date.add( Calendar.Hours_of_Day, 18.0f ) //但是从浮点数转换为整数 -date.add( Calendar.Minutes_of_Day, 0.4f )//

我如何将值 18.4f hours 拆分为'int hours = 18;' 和'int分钟= 40;'
???

public Date getWorkdayIncrement(Calendar date, float incrementInWorkdays) {


    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    System.out.println("start day: " + f.format(date.getTime()));

    // so if chosen incrementDays is 2.3 days and workinghours pr day is 7.5h you multiply them together to get total working hours
    float totalHoursWorkedPrDay = getWorkdayStartAndStop() * incrementInWorkdays;

    // needed to convert hours and minutes to integer values in order to increment calendar
    int hoursToIncrement = (int) totalHoursWorkedPrDay; //gets only hours

    // get the last to decimals 0.25 representing the minutes which means 25 percent of 60min
    float lastTwoDecimalsOfTotalWorkingHours = ((totalHoursWorkedPrDay - (float) hoursToIncrement) * 100);

    //calculate percent of minutes and convert to integer (25 / 100 * 60) = 15min
    int minutesToIncrement = (int) ((lastTwoDecimalsOfTotalWorkingHours / 100) *60);

    System.out.println("Hours to increment: " + hoursToIncrement);
    System.out.println("Minutes to increment: " + minutesToIncrement);

    //increment calendar
    date.add(Calendar.HOUR_OF_DAY, hoursToIncrement);
    date.add(Calendar.MINUTE, minutesToIncrement);

    Date endDate = date.getTime();
    System.out.println("End date excluding holidays: " + f.format(endDate));

}

标签: javacalendar

解决方案


我没有按照您在问题中所做的一切。所以现在我专注于计算给定开始和结束时间的工作日的工作时间。我假设您GregorianCalendar从某些遗留 API 的对象开始和结束,您现在无法升级到 java.time。

我建议您使用现代 Java 日期和时间 API java.time 进行日期和时间工作。即使您将数据作为老式日期时间类型的对象获取。java.time 使用起来要好得多。

static float getHoursBetween(Calendar start, Calendar end) {
    ZonedDateTime startZdt = ((GregorianCalendar) start).toZonedDateTime();
    ZonedDateTime endZdt = ((GregorianCalendar) end).toZonedDateTime();
    long wholeDays = ChronoUnit.DAYS.between(startZdt, endZdt);
    startZdt = startZdt.plusDays(wholeDays);
    Duration workDay = Duration.between(startZdt, endZdt);
    return (float) workDay.toMinutes() / (float) Duration.ofHours(1).toMinutes();
}

该方法通过将全天数添加到开始时间来忽略开始和结束之间的日期差异。这意味着我们得到的结果仅基于小时和分钟。为了尝试这个方法,让我们构造几个GregorianCalendar对象(当然我也在使用 java.time):

    ZoneId zone = ZoneId.of("America/Araguaina");

    ZonedDateTime workDayStart = ZonedDateTime.of(2020, 6, 14, 7, 30, 0, 0, zone);
    Calendar workDayStartCal = GregorianCalendar.from(workDayStart);
    ZonedDateTime workDayEnd = ZonedDateTime.of(2020, 6, 15, 15, 15, 0, 0, zone);
    Calendar workDayEndCal = GregorianCalendar.from(workDayEnd);

    float workingDay = getHoursBetween(workDayStartCal, workDayEndCal);

    System.out.println(workingDay);

该示例的输出为:

7.75

编辑:对于相反的转换,这从 Java 9 开始有效:

    float hours = 7.75f;

    Duration dur = Duration.ofMinutes(Math.round(hours * Duration.ofHours(1).toMinutes()));

    System.out.println("Hours:   " + dur.toHours());
    System.out.println("Minutes: " + dur.toMinutesPart());
Hours:   7
Minutes: 45

关联

Oracle 教程:日期时间解释如何使用 java.time。


推荐阅读