背景:我的应用程序不允许我引入外部库,尽管有些可以访问。我正在使用Java 7。 免责声明:这是我的第一个Stack问题。
我的特定项目是尝试从本地日期中提取两个时间戳,其中第一个日期是记录创建日期,第二个日期是响应日期,然后确定这些日期是否在我的工作日内。稍后我会发现差异。
我已经超出了我的深度,所以我需要帮助将Java 8代码“转换”为Java 7。
我已经搜索了一些松散相关的答案,但是我在努力理解这些概念固有的基础。
主要代码
int allDaysBetween = (int) (ChronoUnit.DAYS.between(fromDay, toDay) + 1);
long allWorkingMinutes = IntStream.range(0, allDaysBetween)
.filter(i -> isWorkingDay(from.plusDays(i)))
.count() * WORKING_MINUTES_PER_DAY ;
支持代码
private boolean isWorkingDay(final LocalDateTime time) {
return time.getDayOfWeek().getValue() < DayOfWeek.SATURDAY.getValue();
}
我只是需要功能上等效的东西。据我了解,plusDays会将关闭办公室的时间添加到我的创建日期中,因此,当我从响应日期获得差异时,我将得到一个值较小的整数。
实际应用是这样的
办公室于2019-04-05 19:00:00关闭
记录创建于2019-04-06 09:35:00
办公室将于2019-04-08 06:00:00
响应创建于2019-04-08 07:32:00
我不想包括周末时间,而是要排除它,所以当我找到差异时,最终得出的是基于工作时间的“正确”分钟数。
答案 0 :(得分:4)
以下Java 8+流代码:
long allWorkingMinutes = IntStream.range(0, allDaysBetween)
.filter(i -> isWorkingDay(from.plusDays(i)))
.count() * WORKING_MINUTES_PER_DAY ;
与在任何Java版本中均可使用的通用代码相同:
long count = 0;
for (int i = 0; i < allDaysBetween; i++)
if (isWorkingDay(from.plusDays(i)))
count++;
long allWorkingMinutes = count * WORKING_MINUTES_PER_DAY ;
对于ChronoUnit
,LocalDateTime
和DayOfWeek
类,请使用ThreeTen Backport获得Java SE 6和7支持。
答案 1 :(得分:0)
即使您说您不能使用外部库(为什么?),我还是建议您使用一个库,即使这样做只是为了其他读者的利益。 java.time已被反向移植。因此,您可以在Java 7上使用相同的日期/时间类型。只有流操作不可用(可能不存在类似功能的库,我不知道)。所以我改用经典循环。
LocalDateTime fromDay = LocalDateTime.of(2019, Month.APRIL, 12, 0, 0);
LocalDateTime toDay = LocalDateTime.of(2019, Month.APRIL, 16, 0, 0);
int allDaysBetween = 0;
for (LocalDate d = fromDay.toLocalDate(); ! d.isAfter(toDay.toLocalDate()); d = d.plusDays(1)) {
if (isWorkingDay(d)) {
allDaysBetween++;
}
}
long allWorkingMinutes = allDaysBetween * WORKING_MINUTES_PER_DAY;
System.out.println(allWorkingMinutes);
我已将threetenbp-1.3.6.jar
和threetenbp-1.3.6-javadoc.jar
添加到我的项目中(我相信存在较新的版本),并且正在使用以下导入:
import org.threeten.bp.DayOfWeek;
import org.threeten.bp.Duration;
import org.threeten.bp.LocalDate;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.Month;
import org.threeten.bp.temporal.ChronoUnit;
我将您的支持方法isWorkingDay
更改为一个LocalDate
参数,因为我发现它很方便,它也适用于您的版本。
您可能要挑战该决定?如果这是一个不使用外部库的项目决定,则可能要挑战。您可能会说ThreeTen Backport不是真正的外部,因为它是Java核心功能的反向移植。并且只有在转移到Java 8或更高版本的一天之前,您才需要该库。
java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。