gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:16:10 25 4
gpt4 key购买 nike

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

结果应该输出:

“开始日期: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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com