下面我有3种方法.第一个很简单.它只计算总天数.但是,第二个不仅会计算天数,还会忽略传递给方法的星期几.

我的问题是第三种方法并不总是正确的.它应该匹配第二种方法.我猜它与闰年有关,因为当它不正确时,差异通常是= 3 | 4.

附加信息

我试图以某种方式模拟Excel的工作日(serial_number,[return_type])公式.

serial_number = startDate:Date - daysOfWeekToInclude:Array<Integer>

| A       | B                                                  | C
  +---------+----------------------------------------------------+-----------
1 | Start   | =DATE(2014,9,7)                                    | 9/7/2014                 
2 | End     | =DATE(2025,6,13)                                   | 6/13/2025                    
3 | Include | ={1,2,4,6} (Mon,Tue,Thu,& Sat)                  | <disp Only>
4 | Days    | =SUM(INT((WEEKDAY($B$1-{1,6},1)+$B$2-$B$1)/7)) | 2248

这里有关于此功能的更多信息:How to count / calculate the number of days between two dates in Excel?

原始图像

方法

>只需计算两个日期之间的天数.

public static int simpleDaysBetween(final LocalDate start,final LocalDate end) {
    return (int) ChronoUnit.DAYS.between(start,end);
}

>使用循环计算天数,忽略一周中的某些天.

public static int betterDaysBetween(final LocalDate start,final LocalDate end,final List<DayOfWeek> ignore) {
    int count = 0;
    LocalDate curr = start.plusDays(0);

    while (curr.isBefore(end)) {
        if (!ignore.contains(curr.getDayOfWeek())) {
            count++;
        }
        curr = curr.plusDays(1); // Increment by a day.
    }

    return count;
}

>计算天数.再次,但没有循环.

public static int bestDaysBetween(final LocalDate start,final List<DayOfWeek> ignore) {
    int days = simpleDaysBetween(start,end);

    if (days == 0) {
        return 0;
    }

    if (!ignore.isEmpty()) {
        int weeks = days / 7;
        int startDay = start.getDayOfWeek().getValue();
        int endDay = end.getDayOfWeek().getValue();
        int diff = weeks * ignore.size();

        for (DayOfWeek day : ignore) {
            int currDay = day.getValue();
            if (startDay <= currDay) {
                diff++;
            }
            if (endDay > currDay) {
                diff++;
            }
        }

        if (endDay > startDay) {
            diff -= endDay - startDay;
        }

        return days - diff;
    }

    return days;
}

完整代码

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.List;

public class DayCounter {
    public static void main(String[] args) {
        final LocalDate start = LocalDate.of(2014,7);
        final LocalDate end = LocalDate.of(2025,13);
        List<DayOfWeek> ignore = Arrays.asList(DayOfWeek.SUNDAY,DayOfWeek.WednESDAY,DayOfWeek.FRIDAY);

        print(start);
        print(end);

        System.out.println(simpleDaysBetween(start,end));
        System.out.println(betterDaysBetween(start,end,ignore));
        System.out.println(bestDaysBetween(start,ignore));
    }

    public static void print(LocalDate date) {
        System.out.printf("%s -> %s%n",date,date.getDayOfWeek());
    }

    public static int simpleDaysBetween(final LocalDate start,final LocalDate end) {
        return (int) ChronoUnit.DAYS.between(start,end);
    }

    public static int betterDaysBetween(final LocalDate start,final List<DayOfWeek> ignore) {
        int count = 0;
        LocalDate curr = start.plusDays(0);

        while (curr.isBefore(end)) {
            if (!ignore.contains(curr.getDayOfWeek())) {
                count++;
            }
            curr = curr.plusDays(1); // Increment by a day.
        }

        return count;
    }

    public static int bestDaysBetween(final LocalDate start,final List<DayOfWeek> ignore) {
        int days = simpleDaysBetween(start,end);

        if (days == 0) {
            return 0;
        }

        if (!ignore.isEmpty()) {
            int weeks = days / 7;
            int startDay = start.getDayOfWeek().getValue();
            int endDay = end.getDayOfWeek().getValue();
            int diff = weeks * ignore.size();

            for (DayOfWeek day : ignore) {
                int currDay = day.getValue();
                if (startDay <= currDay) {
                    diff++;
                }
                if (endDay > currDay) {
                    diff++;
                }
            }

            if (endDay > startDay) {
                diff -= endDay - startDay;
            }

            return days - diff;
        }

        return days;
    }
}

解决方法

如果我们谈论Java 8 API,为什么不使用Java 8功能…
static long daysBetween(LocalDate start,LocalDate end,List<DayOfWeek> ignore) {
    return Stream.iterate(start,d->d.plusDays(1))
                 .limit(start.until(end,ChronoUnit.DAYS))
                 .filter(d->!ignore.contains(d.getDayOfWeek()))
                 .count();
}

使用Java 8计算两个日期之间的天数,同时忽略一周中的某些天的更多相关文章

  1. ios – NSDate得到上周,上个月的问题

    我需要从当前日期开始获得上一个礼拜.所以我找到了可以重新计算当前日期添加间隔的解决方案这个参数:[[NSDatedate]dateByAddingTimeInterval:-604800.0](前一周)[[NSDatedate]dateByAddingTimeInterval:-2629743.83](取得上个月)正如我想,为了让周,这种方法运行良好,没有任何问题,因为每周有七天,间隔没有改变.但

  2. php – 使用DateInterval和DateTime :: add添加月份时会出现什么问题?

    问题是每个月可能有不同的天数.问题是,当您想将日期增加1个月时,您正在做什么.根据PHP文档,如果您在1月31日并且您添加1个月,那么预期的行为是什么?二月只有29天.你想成为这个月的最后一天吗?

  3. 使用Java 8计算两个日期之间的天数,同时忽略一周中的某些天

    原始图像方法>只需计算两个日期之间的天数.>使用循环计算天数,忽略一周中的某些天.>计算天数.再次,但没有循环.完整代码解决方法如果我们谈论Java8API,为什么不使用Java8功能…

  4. 如何计算C#中的两个日期之间的天数减去星期日?

    我正在创建图书馆管理系统.我使用时间戳来计算日期差异,并在日期差异的帮助下,我也在计算Fine.现在这个日期差异包括一周中的所有日子.但是对于图书馆申请,罚款应仅在周内收取6天.我不能这样做任何人都可以帮我执行这项任务吗?

  5. ios – 如何计算核心数据中的天数?

    我需要计算最后一天的日子,但是不知道该怎么做.例如我得到这样的核心数据:我试着检查最后没有呈现(isPresent=0)的日期,直到今天,并获得了________,所以我可以算几天,这很容易.但是如果我标记为second2-14asisPresented=1(如下表中所示),我将得到最后一个没有显示的是,2,但是不正确的是没有数据,此日期应为0,条纹应从此日期算起我搜索了不同的算法,用于缺少日期的

  6. javascript – 使用jQuery将数字(天)转换为日,月和年

    我有一个计算功能,其中的一部分显示了实现目标所需的天数.而不是仅显示我想要计算的天数和天数几个月或几天,几个月和几年,取决于数量.我有一个if语句的分裂,但似乎无法解决数学从例如132天到x天x个月…

  7. Perl:通过转换为秒来计算天数

    我试图计算从数据库中提取的两个日期之间的日历天数.我认为将日期转换为秒将是一个简单而正确的解决方案.最初,我认为这种方法为我提供了可靠的结果:显然,日期之间的日历日期数应该是整数.嗯,我做错了什么?为什么转换为秒不可靠?由于我是一个Perl新手,我可能会忽略这一点.因此,非常欢迎任何帮助.解决方法一种方法是使用Time::Piece核心模块:

  8. 计算java中两个日期之间的天数

    到期日为2016-06-30,当前日期为2016-06-27解决方法原因是,您没有使用相同的时间格式减去两个日期.使用Calendar类将日期的时间更改为00:00:00,您将获得几天的确切差异.JimGarrison’answer中的更多解释

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部