java - 如何计算浮点值并将其拆分为两个单独的整数值?例如 18.5f 小时等于 int h=18 int m=30

标签 java calendar

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

结果应该输出:

“开始日期:2004年5月24日 07:03 加上 8.276628 个工作日为结束日期:2004年6月4日 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 小时拆分为 '整数小时 = 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));

}

最佳答案

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

我建议您使用 java.time(现代 Java 日期和时间 API)来进行日期和时间工作。即使您将数据作为老式日期时间类型的对象获取。 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 tutorial: Date Time解释如何使用 java.time。

关于java - 如何计算浮点值并将其拆分为两个单独的整数值?例如 18.5f 小时等于 int h=18 int m=30,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62384969/

相关文章:

java - 您必须先对子级的父级调用removeView() 2

php - 如何在 php 自定义日程日历的日期单元格中显示客户姓名

java - 如何在启用 SSL 的 Spring Boot 应用程序中连接到 RDS postgres

Java Native Interface 偷偷摸摸的 fork 行为

android - 在将数据转换为设备时区的同时获得4个小时的时间差?

c# - 显示约会显示 UWP CalendarViewDayItem

ruby-on-rails - 创建日历/计划程序应用程序 - Ruby on Rails

Azure DevOps 日历 - 不允许使用 "Add days off"

java - 为 install4j 安装程序创建自定义语言?

java - 哨兵控制循环以及如何打印多个字符串。初学者java编程