gpt4 book ai didi

java - 计算两个日期之间的小时数,不包括周末

转载 作者:行者123 更新时间:2023-11-29 07:35:45 25 4
gpt4 key购买 nike

您好,我在尝试计算 Java 中两个不同时间戳之间发生的一天 24 小时的小时数时遇到问题,不包括周末。

String timestamp = rs.getString("timestamp");

String timeStamp = new SimpleDateFormat("yyyyMMddHH").format(new Date());

int currentTimeStamp = Integer.parseInt(timeStamp);

String orderTime = timestamp.replace("-", "");
String[] splitTimestamp = orderTime.split(" ");

String finalTimestamp = splitTimestamp[0] + splitTimestamp[1].substring(0,2);

int orderTimeStamp = Integer.parseInt(finalTimestamp);

这目前有效,但包括周末。

如果有人能帮助我,我将不胜感激。

这都是在东部时区完成的。不需要或只需要周末休假。

最佳答案

避免使用旧的日期时间类

与最早版本的 Java 捆绑在一起的旧日期时间类设计不佳、困惑且麻烦。避免使用 java.util.Date/.Calendar 等。

java.time

使用 Java 8 及更高版本中内置的 java.time 框架。或其 Java 7 和 6 的反向移植。参见 Oracle Tutorial .

我没有尝试运行这段代码;就在我的头顶。 从未运行,从未测试过。可能会给你一个开始。

问题似乎是说我们要假设通用的 24 小时制一天而不是实际日期(由于夏令时等异常情况,实际日期可能会有所不同)。在通用日期的情况下,我们不关心时区。我们可以使用 LocalDateTime类。

如果刚好在周末开始,则将其移至下周​​一的第一时刻。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyyMMddHH" );
LocalDateTime start = LocalDateTime.parse( "2016010123" , formatter );
// If on a weekend, move to first moment of Monday.
if( start.getDayOfWeek().equals( DayOfWeek.SATURDAY ) {
start = start.plusDays( 2 ).toLocalDate().atStartOfDay();
}
if( start.getDayOfWeek().equals( DayOfWeek.SUNDAY ) {
start = start.plusDays( 1 ).toLocalDate().atStartOfDay();
}

同上停止。如果在周末,则移至下周一的第一时刻。

LocalDateTime stop = LocalDateTime.parse( "2016010723" , formatter );
// If on a weekend, move to first moment of Monday.
if( stop.getDayOfWeek().equals( DayOfWeek.SATURDAY ) {
stop = stop.plusDays( 2 ).toLocalDate().atStartOfDay();
}
if( stop.getDayOfWeek().equals( DayOfWeek.SUNDAY ) {
stop = stop.plusDays( 1 ).toLocalDate().atStartOfDay();
}

如果开始与停止相同,我们就完成了:报告零。

if( start.isEqual( stop ) ) {
return 0;
}

如果开始是在停止之后,我们就会遇到错误情况。抛出异常、尝试纠正问题或报告零,无论在您的应用中是否有意义。

if( start.isAfter( stop ) ) {
return 0; // Or consider it a problem, throw exception.
}

让我们把这个问题分成三个部分:

  • 第一部分,
  • 最后一天,
  • 中间的天数。

为了表示部分天数,我们使用 Duration类(class)。 Duration 是一个时间跨度,以总秒数加纳秒数来跟踪。

第一部分从开始到第二天的第一时刻。

LocalDateTime firstMomentOfDayAfterStart = start.toLocalDate().plusDays(1).atStartOfDay();
Duration firstDayDuration = Duration.between( start , firstMomentOfDayAfterStart );

最后一天从 stop 当天的第一刻开始运行。

LocalDateTime firstMomentOfDayOfStop = stop.toLocalDate().atStartOfDay();
Duration lastDayDuration = Duration.between( firstMomentOfDayOfStop , stop );

我们可以将每个 Duration 转换为小时数。

int hoursFirstDay = firstDayDuration.toHours(); 
int hoursLastDay = lastDayDuration.toHours();

所以我们有定义这些时间跨度的变量,如下图所示。请记住,这些是半开放的,其中每个跨度的结尾都是独有的

[ start > firstMomentOfDayAfterStart ][ firstMomentOfDayAfterStart > firstMomentOfDayOfStop ][ firstMomentOfDayOfStop > stop ]

现在循环遍历那对部分日期之间的所有日期。逐日递增,测试连续的每一天是工作日还是周末。记下我们遇到的工作日。使用得心应手的 DayOfWeek enum比较。

int countWeekdays = 0;
LocalDateTime firstMomentOfSomeDay = firstMomentOfDayAfterStart
while( firstMomentOfSomeDay.isBefore( firstMomentOfDayOfStop ) ) {
DayOfWeek dayOfWeek = firstMomentOfSomeDay.getDayOfWeek();
if( dayOfWeek.equals( DayOfWeek.SATURDAY ) || dayOfWeek.equals( DayOfWeek.SUNDAY ) ) {
// ignore this day.
} else {
countWeekdays ++ ; // Tally another weekday.
}
// Set up the next loop.
firstMomentOfSomeDay = firstMomentOfSomeDay.plusDays( 1 );
}

我们可以使用 TimeUnit枚举将天数转换为小时数。此转换假定通用 24 小时制。

int hoursOfWholeDays = TimeUnit.DAYS.toHours( countWeekDays ) ;

把这些都加起来。

int totalHours = ( hoursFirstDay + hoursOfWholeDays + hoursLastDay ) ;

完成。返回总小时数。

return totalHours ;

如果您的数据通常包含很长一段时间,那么您可以考虑通过检测星期一并计算整周数来优化性能。我假设在业务场景中跟踪订单,时间间隔为少量天数。所以这种优化不太可能很重要。

枚举集

您可以替换行:

if( dayOfWeek.equals( DayOfWeek.SATURDAY ) || dayOfWeek.equals( DayOfWeek.SUNDAY ) )…

…带有 EnumSet .

Set<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) ;

if( weekend.contains( dayOfWeek ) ) …

时间调节器

参见 my answer to another Question有关使用 nextWorkingDay 检测周末的更多信息和 TemporalspreviousWorkingDay 方法类(class)。此类可在 ThreeTen-Extra 中找到扩展 java.time 框架的项目。

此外,该类文档建议编写您自己的时间调整器以适应您的特定业务规则相对容易。

关于java - 计算两个日期之间的小时数,不包括周末,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36138449/

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