输出指定日期区间内的所有天、周、月

这篇具有很好参考价值的文章主要介绍了输出指定日期区间内的所有天、周、月。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

部分方法需要依赖hutool工具包。

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>4.5.10</version>
</dependency>`

需求:输出2023-04-17到2023-05-23期间所有的天、周、月。

:2023-04-17、2023-04-18、…2023-05-23
:202317(第17周)、202318(第18周)…
周的范围(周日作为每周第一天):2023-04-17至2023-04-23、2023-04-24至2023-04-30…
周的范围(周一作为每周第一天):2023-04-23至2023-04-29、2023-04-30至2023-05-06…
:2023-04、2023-05


输入输出yyyy-MM-dd格式

String startDateString = "2023-04-23";
String endDateString = "2023-05-07";

输出这两个日期之间所有的日期

输入输出yyyy-MM-dd格式

public static List<String> getDatesBetween(String startDateString, String endDateString) {
    List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.DAY_OF_MONTH);
    return datesBetween.stream()
            .map(p -> DateUtil.format(p, DatePattern.NORM_DATE_PATTERN))
            .collect(Collectors.toList());
}

测试:

System.out.println("getDatesBetween:"+ JSON.toJSONString(getDatesBetween(startDateString,endDateString)));

输出:

getDatesBetween:["2023-04-23","2023-04-24","2023-04-25","2023-04-26","2023-04-27","2023-04-28","2023-04-29","2023-04-30","2023-05-01","2023-05-02","2023-05-03","2023-05-04","2023-05-05","2023-05-06","2023-05-07"]

输出这两个日期之间所有的周(数字)

比如:[“202318”,“202319”] 表示2023年第18、19周

public static List<String> getWeeksBetween(String startDateString, String endDateString) {
    // 这种情况必须重置结束日期,结束日期最好改成这周的最后一天,不然会丢失最后不足一周的数据
    endDateString = DateUtil.format(DateUtil.endOfWeek(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);
    List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.WEEK_OF_YEAR);
    return datesBetween.stream()
            .map(p -> String.format("%d%02d", DateUtil.year(p), DateUtil.weekOfYear(p)))
            .collect(Collectors.toList());
}

我在测试的时候发现,如果结束日期不是这周的最后一天,它可能会少一周数据,所以直接重置结束日期。

测试:

System.out.println("getMonthsBetween:"+ JSON.toJSONString(getMonthsBetween(startDateString,endDateString)));

输出:

getWeeksBetween:["202317","202318","202319"]

输出这两个日期之间所有的周(周一为每周的第一天)

比如:[“2023-04-24至2023-04-30”,“2023-05-01至2023-05-07”]

public static List<String> getWeeksMonBetween(String startDateString, String endDateString) {
    return getWeeksBetween(startDateString, endDateString,  Calendar.MONDAY);
}

private static List<String> getWeeksBetween(String startDateString, String endDateString ,int firstDay) {
    Date startDate = DateUtil.parse(startDateString);
    Date endDate = DateUtil.parse(endDateString);
    List<String> weekStartDates = new ArrayList<>();
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(startDate);
    while (calendar.getTime().compareTo(endDate) <= 0) {
        // 获取当前日期所在周的起始日期
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        int diff = (dayOfWeek - firstDay + 7) % 7;
        calendar.add(Calendar.DAY_OF_YEAR, -diff);
        String weekStart = DateUtil.format(calendar.getTime(), DatePattern.NORM_DATE_PATTERN);
        // 获取当前日期所在周的结束日期
        calendar.add(Calendar.DAY_OF_YEAR, 6);
        String weekEnd = DateUtil.format(calendar.getTime(), DatePattern.NORM_DATE_PATTERN);
        weekStartDates.add(weekStart + "至" + weekEnd);
        // 将日期移动到下一周的起始日期
        calendar.add(Calendar.DAY_OF_YEAR, 1);
    }
    return weekStartDates;
}

测试:

System.out.println("getWeeksMonBetween:"+ JSON.toJSONString(getWeeksMonBetween(startDateString,endDateString)));

输出:

getWeeksMonBetween:["2023-04-17至2023-04-23","2023-04-24至2023-04-30","2023-05-01至2023-05-07"]

输出这两个日期之间所有的周(周日为一周的第一天)

比如:[“2023-04-24至2023-04-30”,“2023-05-01至2023-05-07”]

public static List<String> getWeeksSunBetween(String startDateString, String endDateString) {
    return getWeeksBetween(startDateString, endDateString,  Calendar.SUNDAY);
}

还是调用上边的方法,只是参数换成Calendar.SUNDAY

测试:

System.out.println("getWeeksSunBetween:"+ JSON.toJSONString(getWeeksSunBetween(startDateString,endDateString)));

输出:

getWeeksSunBetween:["2023-04-23至2023-04-29","2023-04-30至2023-05-06","2023-05-07至2023-05-13"]

输出这两个日期之间所有的月

比如:[“2023-04”,“2023-05”]

public static List<String> getMonthsBetween(String startDateString, String endDateString) {
    // 这种情况必须重置结束日期,结束日期最好改成这月的最后一天
    endDateString = DateUtil.format(DateUtil.endOfMonth(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);
    List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.MONTH);
    return datesBetween.stream()
            .map(p -> DateUtil.format(p, "yyyy-MM"))
            .collect(Collectors.toList());
}

测试:

System.out.println("getMonthsBetween:"+ JSON.toJSONString(getMonthsBetween(startDateString,endDateString)));

输出:

getMonthsBetween:["2023-04","2023-05"]

输出这两个日期之间所有的周(周一为每周的第一天)方案B

private static List<String> getWeeksMonBetweenPlanB(String startDateString, String endDateString) {
    // 这种情况必须重置结束日期,结束日期最好改成这周的最后一天
    endDateString = DateUtil.format(DateUtil.endOfWeek(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);
    List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.WEEK_OF_YEAR);
    return datesBetween.stream().map(p -> {
        String startOfWeek = DateUtil.format(DateUtil.beginOfWeek(p), DatePattern.NORM_DATE_PATTERN);
        String endOfWeek = DateUtil.format(DateUtil.endOfWeek(p), DatePattern.NORM_DATE_PATTERN);
        return startOfWeek + "至" + endOfWeek;
    }).collect(Collectors.toList());
}

测试:

System.out.println("getWeeksMonBetweenPlanB:"+ JSON.toJSONString(getWeeksMonBetweenPlanB(startDateString,endDateString)));

输出:文章来源地址https://www.toymoban.com/news/detail-465243.html

getWeeksMonBetweenPlanB:["2023-04-17至2023-04-23","2023-04-24至2023-04-30","2023-05-01至2023-05-07"]

完整工具类

package com.test.util;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description: 日期范围工具
 * @title: DateRangeUtil
 * @Date: 2023/5/23 16:06
 * @Version 1.0
 */
public class DateRangeUtil {


    /**
     * 输出这两个日期之间所有的日期 yyyy-MM-dd格式
     * @param startDateString
     * @param endDateString
     * @return
     */
    public static List<String> getDatesBetween(String startDateString, String endDateString) {
        List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.DAY_OF_MONTH);
        return datesBetween.stream()
                .map(p -> DateUtil.format(p, DatePattern.NORM_DATE_PATTERN))
                .collect(Collectors.toList());
    }

    /**
     * 输出这两个日期之间所有的周(数字) 比如:["202318","202319"] 表示2023年第18、19周
     * @param startDateString
     * @param endDateString
     * @return
     */
    public static List<String> getWeeksBetween(String startDateString, String endDateString) {
        // 这种情况必须重置结束日期,结束日期最好改成这周的最后一天,不然会丢失最后不足一周的数据
        endDateString = DateUtil.format(DateUtil.endOfWeek(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);
        List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.WEEK_OF_YEAR);
        return datesBetween.stream()
                .map(p -> String.format("%d%02d", DateUtil.year(p), DateUtil.weekOfYear(p)))
                .collect(Collectors.toList());
    }


    /**
     * 输出这两个日期之间所有的周(周一为一周的第一天) 比如:["2023-04-24至2023-04-30","2023-05-01至2023-05-07"]
     * @param startDateString
     * @param endDateString
     * @return
     */
    public static List<String> getWeeksMonBetween(String startDateString, String endDateString) {
        return getWeeksBetween(startDateString, endDateString,  Calendar.MONDAY);
    }

    /**
     * 输出这两个日期之间所有的周(周日为一周的第一天) 比如:["2023-04-24至2023-04-30","2023-05-01至2023-05-07"]
     * @param startDateString
     * @param endDateString
     * @return
     */
    public static List<String> getWeeksSunBetween(String startDateString, String endDateString) {
        return getWeeksBetween(startDateString, endDateString,  Calendar.SUNDAY);
    }

    private static List<String> getWeeksBetween(String startDateString, String endDateString ,int firstDay) {
        Date startDate = DateUtil.parse(startDateString);
        Date endDate = DateUtil.parse(endDateString);
        List<String> weekStartDates = new ArrayList<>();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(startDate);
        while (calendar.getTime().compareTo(endDate) <= 0) {
            // 获取当前日期所在周的起始日期
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            int diff = (dayOfWeek - firstDay + 7) % 7;
            calendar.add(Calendar.DAY_OF_YEAR, -diff);
            String weekStart = DateUtil.format(calendar.getTime(), DatePattern.NORM_DATE_PATTERN);
            // 获取当前日期所在周的结束日期
            calendar.add(Calendar.DAY_OF_YEAR, 6);
            String weekEnd = DateUtil.format(calendar.getTime(), DatePattern.NORM_DATE_PATTERN);
            weekStartDates.add(weekStart + "至" + weekEnd);
            // 将日期移动到下一周的起始日期
            calendar.add(Calendar.DAY_OF_YEAR, 1);
        }
        return weekStartDates;
    }

    /**
     * 输出这两个日期之间所有的月 比如:["2023-04","2023-05"]
     * @param startDateString
     * @param endDateString
     * @return
     */
    public static List<String> getMonthsBetween(String startDateString, String endDateString) {
        // 这种情况必须重置结束日期,结束日期最好改成这月的最后一天
        endDateString = DateUtil.format(DateUtil.endOfMonth(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);
        List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.MONTH);
        return datesBetween.stream()
                .map(p -> DateUtil.format(p, "yyyy-MM"))
                .collect(Collectors.toList());
    }

    // B方案 未使用
    private static List<String> getWeeksMonBetweenPlanB(String startDateString, String endDateString) {
        // 这种情况必须重置结束日期,结束日期最好改成这周的最后一天
        endDateString = DateUtil.format(DateUtil.endOfWeek(DateUtil.parse(endDateString)), DatePattern.NORM_DATE_PATTERN);
        List<DateTime> datesBetween = DateUtil.rangeToList(DateUtil.parseDate(startDateString), DateUtil.parseDate(endDateString), DateField.WEEK_OF_YEAR);
        return datesBetween.stream().map(p -> {
            String startOfWeek = DateUtil.format(DateUtil.beginOfWeek(p), DatePattern.NORM_DATE_PATTERN);
            String endOfWeek = DateUtil.format(DateUtil.endOfWeek(p), DatePattern.NORM_DATE_PATTERN);
            return startOfWeek + "至" + endOfWeek;
        }).collect(Collectors.toList());
    }

    public static void main(String[] args) {
        String startDateString = "2023-04-23";
        String endDateString = "2023-05-07";
        System.out.println("getDatesBetween:"+ JSON.toJSONString(getDatesBetween(startDateString,endDateString)));
        System.out.println("getWeeksMonBetween:"+ JSON.toJSONString(getWeeksMonBetween(startDateString,endDateString)));
        System.out.println("getWeeksSunBetween:"+ JSON.toJSONString(getWeeksSunBetween(startDateString,endDateString)));
        System.out.println("getWeeksBetween:"+ JSON.toJSONString(getWeeksBetween(startDateString,endDateString)));
        System.out.println("getMonthsBetween:"+ JSON.toJSONString(getMonthsBetween(startDateString,endDateString)));
        System.out.println("getWeeksMonBetweenPlanB:"+ JSON.toJSONString(getWeeksMonBetweenPlanB(startDateString,endDateString)));
    }

}

到了这里,关于输出指定日期区间内的所有天、周、月的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s查看所有在运行pod内的镜像版本

    本地跑的算法镜像有时候与线上跑的环境不一致,这时候又需要同步,每一个都去查找又很麻烦 这时候查看两边的镜像,选取其中不同的地方edit一下,就方便多了 名称空间更改为自己的名称空间 查询镜像并去重,有名称空间的  记得把名称空间加上  同时显示pod名称和镜像

    2024年02月12日
    浏览(52)
  • hive数据库delete删除部分数据/删除分区内的数据

    在Hive中,删除部分数据是一个常见的操作,特别是当我们需要清除不再需要的数据或者进行数据更新时。Hive提供了多种方式来删除部分数据,本文将介绍其中几种常用的方法。 最简单的方法是删除整个表,这将删除表中的所有数据。可以使用DROP TABLE语句来完成这个操作。下

    2024年02月04日
    浏览(39)
  • 链表指定区间反转

    题目:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 输入:1-2-3-4-5-NULL, m = 2, n = 4 输出:1-4-3-2-5-NULL Java实现 python实现 Java实现 python实现

    2024年02月09日
    浏览(23)
  • vue element-ui年份范围选择器,年日期插件,可选日期区间等

    可以禁止选择未来日期,以及可选的日期范围控制,代码在最下面。 直接上代码: 先来一个不禁止选择的示例 yearDate.js文件 我是禁止了未来日期,时间跨度,只能选3年, 代码如下: 参考地址:https://www.jianshu.com/p/44584a4a4953

    2024年02月11日
    浏览(38)
  • 如何在 MATLAB 中生成指定范围内的随机数

    如何在 MATLAB 中生成指定范围内的随机数 在 MATLAB 中,我们可以使用内置函数来生成指定范围内的随机数。这些函数包括 rand 、 randi 和 randn ,它们分别用于生成在[0,1)范围内的均匀分布随机数、在指定范围内的整数随机数以及符合标准正态分布的随机数。 下面我将为你展示如

    2024年02月06日
    浏览(44)
  • ElasticSearch - 根据经纬度,简单搜索指定距离范围内的数据

    ES的地图检索方式 ES支持的地图检索方式有以下几种; geo_distance geo_bounding_box geo_polygon 1、 geo_distance :直线距离检索,如给定点A,要求返回地图上距离点A三千米的商家(点外卖场景) 2、查找索引内距离北京站(116.433733,39.908404)3000米内的点 geo_distance涉及的参数如下 location:确

    2024年02月14日
    浏览(33)
  • 【Hive SQL 每日一题】统计用户连续下单的日期区间

    测试数据 需求说明 统计用户连续下单的日期区间,所以连续的下单日期必须 = 2 ,例如: 2023-01-01,2023-01-02 。 分析步骤如下: 按 user_id 、 order_date 进行分组,同天的下单日期只保留一条。 使用 row_number 窗口函数对行号进行标记。 使用 date_sub 函数与行号标记进行运算,如果

    2024年02月09日
    浏览(25)
  • 【Axure高保真原型】JS版日期区间下拉选择器

    今天和大家分享JS版日期区间下拉选择器的原型模板,该模板通过调用浏览器的下拉列表,所以可以获取真实的日历效果,具体包括哪一年二月份有29天,几号对应星期几,都是真实的。建议使用谷歌浏览器来演示,其他浏览器效果可能有差别或者失效。具体效果可以点击下方

    2024年02月13日
    浏览(48)
  • java生成指定区间的随机数

    随机数 例:编写程序随机生成k个位于[m,n]区间的整数,对这k个数据进行升序排序并输出。 在使用Java生成随机数的时候,有一些注意事项需要注意,下面是一些常见的问题和解决方案: 1. 生成随机数时,应该使用Java的 Random 类,而不是 Math.random() 方法。原因是, Math.rando

    2024年02月10日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包