Java:检查当前日期是不是在特定日期范围内[重复]

     2023-02-24     233

关键词:

【中文标题】Java:检查当前日期是不是在特定日期范围内[重复]【英文标题】:Java: Check if current date is in range of specific days [duplicate]Java:检查当前日期是否在特定日期范围内[重复] 【发布时间】:2016-02-15 12:35:53 【问题描述】:

我正在努力解决以下问题:

在我的应用程序中,我想检查当前日期时间是否来自 LocalDateTime.now() 在一周中的某些特定日期范围内,例如在 星期五星期日 之间。

例子:

日期时间窗口从 星期五 20:00星期日 20:00。当我在 星期四22:00* 检查当前日期时,答案应该是 false 但当我在 **星期六8:00,答案应该是true

我可以通过java.time API 中的DayOfWeek 类使用compareTo() 方法并分别比较小时和分钟来实现这一点,但我想知道是否有更好的方法来做到这一点,尤其是当范围的天数跨越两周(例如下一周的星期五星期一)?

提前感谢您的任何建议或帮助。

【问题讨论】:

@Spock 我认为主题涵盖了 2 个日期范围的情况并检查它们是否重叠。我的情况不同。我只有 1 个日期范围,并想检查特定日期是否在该范围内。 @Supermartzin 但它提供了许多实现目标所需的概念 您要查找的内容类似于 Span:sourceforge.net/p/tus/code/HEAD/tree/tjacobs/util/Span.java(您可以删除 implements PrimaryKey 只需使用 isAfter 和 isBefore,您应该能够确定日期是否在两个日期之前和/或之后 作为概念example 【参考方案1】:

由于您想将 LocalDateTimeDayOfWeek+LocalTime 进行比较,或者检查它是否在两个 DayOfWeek+LocalTime 对之间,所以辅助类可能会更好:

public final class DayOfWeekTimeRange 
    private final DayOfWeek fromDay;
    private final LocalTime fromTime;
    private final DayOfWeek toDay;
    private final LocalTime toTime;
    private final boolean   inverted;
    public DayOfWeekTimeRange(DayOfWeek fromDay, LocalTime fromTime, DayOfWeek toDay, LocalTime toTime) 
        this.fromDay = fromDay;
        this.fromTime = fromTime;
        this.toDay = toDay;
        this.toTime = toTime;
        this.inverted = compare(this.fromDay, this.fromTime, this.toDay, this.toTime) > 0;
    
    public boolean inRange(LocalDateTime dateTime) 
        return inRange(dateTime.getDayOfWeek(), dateTime.toLocalTime());
    
    public boolean inRange(DayOfWeek day, LocalTime time) 
        boolean fromOk = compare(day, time, this.fromDay, this.fromTime) >= 0; // Lower-inclusive
        boolean toOk   = compare(day, time, this.toDay  , this.toTime  ) <  0; // Upper-exclusive
        return (this.inverted ? fromOk || toOk : fromOk && toOk);
    
    private static int compare(DayOfWeek day1, LocalTime time1, DayOfWeek day2, LocalTime time2) 
        int cmp = day1.compareTo(day2);
        if (cmp == 0)
            cmp = time1.compareTo(time2);
        return cmp;
    

测试

// Fri 10:00 PM  to  Sun 10:00 PM
DayOfWeekTimeRange range = new DayOfWeekTimeRange(DayOfWeek.FRIDAY, LocalTime.of(20,0), DayOfWeek.SUNDAY, LocalTime.of(20,0));
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 12, 22, 0))); // Thu Nov. 12 2015 at 10:00 PM
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 14,  8, 0))); // Sat Nov. 14 2015 at  8:00 AM
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 16, 15, 0))); // Mon Nov. 16 2015 at  3:00 PM

// Fri 10:00 PM  to  Mon 10:00 PM
range = new DayOfWeekTimeRange(DayOfWeek.FRIDAY, LocalTime.of(20,0), DayOfWeek.MONDAY, LocalTime.of(20,0));
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 12, 22, 0))); // Thu Nov. 12 2015 at 10:00 PM
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 14,  8, 0))); // Sat Nov. 14 2015 at  8:00 AM
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 16, 15, 0))); // Mon Nov. 16 2015 at  3:00 PM

输出

false
true
false
false
true
true

替代方案

当然,如果你用DayOfWeek+LocalTime做很多处理,你应该考虑实现你自己的LocalDayOfWeekTime类,将两者结合起来,同样LocalDateTime只是一个结合的@987654333 @+LocalTime(确实如此,请自行检查)。

【讨论】:

谢谢!这就是我要找的! :) @Supermartzin 仅供参考,您可以投票并接受答案。 请注意,此答案使用半开放方法,其中时间跨度的开始是包含,而结束是独占。这在日期时间工作中很常见。【参考方案2】:

只有当我们还假设间隔总是短于一周时,这个问题才能得到很好的定义。

然后您可以以 1 周为模工作;例如。如果您以毫秒为单位表示所有内容,您将取模 N = 1000 * 60 * 60 * 24 * 7。

现在计算 a = checkdate - start (mod N) 和 b = end - start (mod N) 并测试 a

您需要选择一个真正的开始和结束日期,在您的示例中是真正的星期五 20:00 和真正的星期六 20:00。因为模运算,哪一个都没有关系。

还要记住,Java % 运算符不同于负数的数学模型。因此,请确保仅将其应用于正数。

【讨论】:

你的建议是对的,现在唯一要解决的就是找出一周中那些日子的真实日期。任何想法?我找不到。 例如,星期五 20:00 将是 2015 年 11 月 9 日 00:00 之后的 4 天 20 小时。【参考方案3】:

首先你需要让你的函数接受一个日期时间参数,如果你在里面使用“now()”你将无法测试它。

您的基本想法似乎不错,使用星期几作为数组的索引或检查范围,如果范围超过一周的开始/结束,则将其设为两个范围或反转它。

【讨论】:

【参考方案4】:

我编写了一个测试程序,它需要两个日期时间(范围),然后测试一个日期时间以查看它是否在该范围内。

我使用了完整的日期,以便您可以根据需要跨越一周以上。

以下是测试结果:

Testing for the date range Fri, 13 Nov 2015 20:00 to Sun, 15 Nov 2015 20:00
12 Nov 2015 22:00: false
14 Nov 2015 08:00: true
16 Nov 2015 10:00: false

这是代码。我将日期时间输入为字符串,以便更轻松地使用此代码,

package com.ggl.testing;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateRangeTesting 

    private static final SimpleDateFormat inputDateFormat = new SimpleDateFormat(
            "d MMM yyyy H:mm");
    private static final SimpleDateFormat outputDateFormat = new SimpleDateFormat(
            "EEE, d MMM yyyy H:mm");

    private Calendar fromDate;
    private Calendar toDate;

    public static void main(String[] args) 
        DateRangeTesting drTesting = new DateRangeTesting("13 Nov 2015 20:00",
                "15 Nov 2015 20:00");
        printResult("12 Nov 2015 22:00", drTesting);
        printResult("14 Nov 2015 08:00", drTesting);
        printResult("16 Nov 2015 10:00", drTesting);
    

    private static void printResult(String s, DateRangeTesting drTesting) 
        System.out.println(s + ": " + drTesting.testDate(s));
    

    public DateRangeTesting(String fromDateString, String toDateString) 
        this.fromDate = convertInputDate(fromDateString);
        this.toDate = convertInputDate(toDateString);
        System.out.println(displayRange());
    

    private String displayRange() 
        StringBuilder builder = new StringBuilder();
        builder.append("Testing for the date range ");
        builder.append(outputDateFormat.format(fromDate.getTime()));
        builder.append(" to ");
        builder.append(outputDateFormat.format(toDate.getTime()));

        return builder.toString();
    

    public boolean testDate(String dateString) 
        Calendar testDate = convertInputDate(dateString);
        boolean fromTest = fromDate.compareTo(testDate) <= 0;
        boolean toTest = testDate.compareTo(toDate) <= 0;
        return fromTest && toTest;
    

    private Calendar convertInputDate(String dateString) 
        Calendar calendar = Calendar.getInstance();
        try 
            Date tempDate = inputDateFormat.parse(dateString);
            calendar.setTime(tempDate);
         catch (ParseException e) 
            e.printStackTrace();
        

        return calendar;
    


【讨论】:

谢谢,这是一个很好的解决方案,除了我不知道范围内的确切日期,我只知道一天和一天中的时间,所以我必须以某种方式找出那些阈值天的日期和次。 @Supermartzin:是的,这是另一种要创建的方法。方法签名是什么? getDate(Calendar.SUNDAY, 0) 之类的东西,其中 0 代表当前的星期日,1 代表下一个星期日,等等。我假设这将基于当前日期。 我明白你的意思。无论如何,我更喜欢使用新的 **Java 8 Datetime API **

检查输入的日期时间是不是在 2 个日期时间值的范围内

】检查输入的日期时间是不是在2个日期时间值的范围内【英文标题】:checkwhetherentereddatetimeisbetweentherangeof2datetimevalues检查输入的日期时间是否在2个日期时间值的范围内【发布时间】:2013-03-0515:21:11【问题描述】:我有一个包含... 查看详情

MySQL 检查日期范围是不是在日期范围内

】MySQL检查日期范围是不是在日期范围内【英文标题】:MySQLCheckifdaterangeisindaterangeMySQL检查日期范围是否在日期范围内【发布时间】:2015-04-1909:20:17【问题描述】:在为小型预订系统进行SQL查询时遇到问题,我有一个包含两个条... 查看详情

SQL 检查一组日期是不是在指定的日期范围内

】SQL检查一组日期是不是在指定的日期范围内【英文标题】:SQLTocheckifasetofdatesfallwithinaspecifiedrangeofdatesSQL检查一组日期是否在指定的日期范围内【发布时间】:2011-02-1709:29:40【问题描述】:我有一个表格,其中包含架构中房间... 查看详情

检查一个表中的日期是不是出现在 Access 中另一个表的范围内

】检查一个表中的日期是不是出现在Access中另一个表的范围内【英文标题】:CheckifdateinonetableappearsinrangeinanothertableinAccess检查一个表中的日期是否出现在Access中另一个表的范围内【发布时间】:2014-03-2116:58:04【问题描述】:我正... 查看详情

mysql在日期范围内选择日期[重复]

】mysql在日期范围内选择日期[重复]【英文标题】:mysqlselectdateinsideadaterange[duplicate]【发布时间】:2013-04-0215:37:47【问题描述】:我有以下列:date_start|日期结束2013-01-14|2013-01-162013-01-16|2013-03-182013-01-22|2013-03-212013-02-02|2013-02-102013-0... 查看详情

如何获取给定时间段内日期在特定范围内的所有行?

】如何获取给定时间段内日期在特定范围内的所有行?【英文标题】:Howtogetallrowswheredateisinaspecificrangeatagivenperiod?【发布时间】:2016-02-1208:12:33【问题描述】:如何在给定时间段(例如每14天)从日期列位于特定日期范围内的表... 查看详情

选择日期范围内的特定日期

】选择日期范围内的特定日期【英文标题】:Selectingcertaindaysinadaterange【发布时间】:2016-02-1523:28:41【问题描述】:我有下面的查询,它给出了学生缺勤的天数。DATEDIFF和DATEPART计算工作日和节假日不应算作缺勤日。缺勤天数存储... 查看详情

在特定日期范围内接收 ORA-01427

】在特定日期范围内接收ORA-01427【英文标题】:ReceivingORA-01427inspecificdateranges【发布时间】:2021-01-2615:25:19【问题描述】:我有一个在不同日期范围内返回ORA-01427的ORACLEBIP查询。我不理解该错误,并相信我已将其缩小到特定的行... 查看详情

如何获取重复 usid 的特定日期范围的最新数据

】如何获取重复usid的特定日期范围的最新数据【英文标题】:howtogetlatestdataforaparticulardaterangeforduplicateusrid【发布时间】:2020-01-1220:56:33【问题描述】:我有2张桌子。一个是用户详细信息,另一个是付款表。我只想在一个月内获... 查看详情

如何知道日期范围是不是与Java中的另一个日期范围相交 - Groovy [重复]

】如何知道日期范围是不是与Java中的另一个日期范围相交-Groovy[重复]【英文标题】:HowtoknowifadaterangeintersectswithanotherdaterangeinJava-Groovy[duplicate]如何知道日期范围是否与Java中的另一个日期范围相交-Groovy[重复]【发布时间】:2019-01... 查看详情

在特定日期范围内获取结果[关闭]

】在特定日期范围内获取结果[关闭]【英文标题】:Getresultsbetweenspecificdaterange[closed]【发布时间】:2020-08-0202:52:48【问题描述】:我正在使用nodejs和猫鼬创建一个API。我已成功保存数据。constsalesSchema=newmongoose.Schema(userID:type:String,... 查看详情

自定义验证规则,检查日期范围是不是已经被占用

】自定义验证规则,检查日期范围是不是已经被占用【英文标题】:Customvalidationrule,checkifdaterangeisalreadytakenornot自定义验证规则,检查日期范围是否已经被占用【发布时间】:2022-01-0503:22:08【问题描述】:我必须管理房屋租赁的... 查看详情

使用 R 测试日期是不是出现在多个日期范围内

】使用R测试日期是不是出现在多个日期范围内【英文标题】:TestifdateoccursinmultipledaterangeswithR使用R测试日期是否出现在多个日期范围内【发布时间】:2016-10-2208:59:48【问题描述】:我有一个包含多个日期范围(确切地说是45个)... 查看详情

检查两个 Java 日期是不是相同 |安卓[重复]

】检查两个Java日期是不是相同|安卓[重复]【英文标题】:CheckingifTwoJavaDatesareSameDate|Android[duplicate]检查两个Java日期是否相同|安卓[重复]【发布时间】:2021-12-2217:16:12【问题描述】:我想检查两个日期。如果两个日期相同,则recycl... 查看详情

检查日期是不是在 sql 中的日期范围之间(不检查年份)

】检查日期是不是在sql中的日期范围之间(不检查年份)【英文标题】:checkifdatesarebetweendaterangeinsql(checkwithoutyear)检查日期是否在sql中的日期范围之间(不检查年份)【发布时间】:2012-05-1505:35:29【问题描述】:我正在开发一个... 查看详情

使用javascript验证用户输入日期是不是在给定的日期范围内

】使用javascript验证用户输入日期是不是在给定的日期范围内【英文标题】:Validateuserinputdatesareingivendaterangeusingjavascript使用javascript验证用户输入日期是否在给定的日期范围内【发布时间】:2013-05-0418:53:34【问题描述】:我是php... 查看详情

检查 MYSQL 表行中是不是存在特定时间范围

】检查MYSQL表行中是不是存在特定时间范围【英文标题】:CheckSpecificTimerangeexistsinsidetheMYSQLtablerows检查MYSQL表行中是否存在特定时间范围【发布时间】:2020-07-1612:52:10【问题描述】:我有一张表,其中包含各种事件的开始和结束... 查看详情

检查两个日期期间是不是重叠[重复]

】检查两个日期期间是不是重叠[重复]【英文标题】:Checkiftwodateperiodsoverlap[duplicate]检查两个日期期间是否重叠[重复]【发布时间】:2013-09-2702:29:43【问题描述】:我有两个日期范围,(start1,end1):::>>date1&&(start2,end2):::>... 查看详情