当前位置: 首页 > 知识库问答 >
问题:

查找一天(例如星期日或星期一)是否在Java中的两个给定的日子之间

贲永思
2023-03-14

例如,如果输入是sunday,那么假设day=1。

int day = 1;

两天将过去。开始日期和结束日期。假设开始日期是星期一,结束日期是星期三,我想要一个返回false的方法。

输入日期可以是任意日期(星期一是2,星期二是3等等),开始和结束日期可以是任意日期。

下面是我试过的片段。但这并不准确。有人能帮忙吗?

   int day = 1; 
   // Will be 2 for monday, 3 for tuesday etc. 
   // Consider that the value of day is passed as parameter

  int startDayOfWeek = startDate.getCalendar().get (Calendar.DAY_OF_WEEK);
  int endDayOfWeek = endDate.getCalendar().get (Calendar.DAY_OF_WEEK);  
  LocalDate resStartDate = startDate;

  LocalDate resEndDate = resAvailabilityDetails.endDate)
  int diffBetweenStartEndDate = 
      Days.daysBetween (resStartDate, resEndDate).getDays();
  // If the Available_on is Thursday, and if the start date and end 
  // date, inclusive, do not overlap a Thursday, then do not show the
  // record. Similarly for other days of the week
  if (diffBetweenStartEndDate < 7 && ! (day >= startDayOfWeek || day <= endDayOfWeek)) {
       continue;
  }

共有3个答案

巫培
2023-03-14

我想我现在明白了,但也许有人喜欢复制我的测试代码来检查自己的解决方案或改进测试:

String [] daya = {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"}; 
List <String> days = Arrays.asList (daya);

boolean dayInRange (String check, String from, String to) {
  int f = days.indexOf (from);
  int t = days.indexOf (to);
  int c = days.indexOf (check);
  if (f < 0 || t < 0 || c < 0)  {
    System.out.print ("  invalid date! ");
    return false; 
  }

  if (f < t) {
    System.out.print ("ordinary between");
    return (f <= c && c <= t); // ordinary ordering 
  }
  if (f == t) {
    System.out.print ("   start=end    ");
    return (f == c); // From-to is same date, 
  }
  if (f > t) {
    System.out.print ("weekend passing ");
    return (t <= c || c <= f); // range over the weekend border 
  }
  System.out.print (" no match ");
  return false;
} 


void check (boolean expected, String x, String f, String t, String msg) {
    if (expected == dayInRange (x, f, t)) 
        System.out.println ("fine +: (" + x + ") in " + f + "-"  + t + " :\t"  + msg);
    else 
        System.out.println ("bad---: (" + x + ") " + f + "-"  + t + " :\t"  + msg);
}

check (true,  "Mo", "Mo", "Th", "on left boundary");
check (true,  "Th", "Mo", "Th", "on right boundary");
check (false, "We", "Mo", "Tu", "Wednsday past Tuesday (and Mo)"); 
check (false, "Mo", "We", "Fr", "Mo before We (and Fr)") 
check (true,  "We", "Mo", "Th", "ordinary mo-_-(we)-th");
check (true,  "We", "We", "We", "one day interval, hit");
check (false, "Fr", "We", "We", "one day interval, past");
check (false, "Mo", "We", "We", "one day interval, too early");
check (true,  "We", "Fr", "Th", "every day should fit between Fr and Th") 
check (false, "Yo", "Mo", "Th", "no such date");

这显然是一种情况,测试代码非常有用。但我们也需要算法的反馈,以检查哪个测试产生了结果。我的第一次实现并没有揭示这一点。

测试的Jshell输出:

-> check (true,  "Mo", "Mo", "Th", "on left boundary");
ordinary betweenfine +: (Mo) in Mo-Th : on left boundary

-> check (true,  "Th", "Mo", "Th", "on right boundary");
ordinary betweenfine +: (Th) in Mo-Th : on right boundary

-> check (false, "We", "Mo", "Tu", "Wednsday past Tuesday (and Mo)"); 
ordinary betweenfine +: (We) in Mo-Tu : Wednsday past Tuesday (and Mo)

-> check (false, "Mo", "We", "Fr", "Mo before We (and Fr)") 
ordinary betweenfine +: (Mo) in We-Fr : Mo before We (and Fr)

-> check (true,  "We", "Mo", "Th", "ordinary mo-_-(we)-th");
ordinary betweenfine +: (We) in Mo-Th : ordinary mo-_-(we)-th

-> check (true,  "We", "We", "We", "one day interval, hit");
   start=end    fine +: (We) in We-We : one day interval, hit

-> check (false, "Fr", "We", "We", "one day interval, past");
   start=end    fine +: (Fr) in We-We : one day interval, past

-> check (false, "Mo", "We", "We", "one day interval, too early");
   start=end    fine +: (Mo) in We-We : one day interval, too early

-> check (true,  "We", "Fr", "Th", "every day should fit between Fr and Th") 
weekend passing fine +: (We) in Fr-Th : every day should fit between Fr and Th

-> check (false, "Yo", "Mo", "Th", "no such date");
  invalid date! fine +: (Yo) in Mo-Th : no such date
胡越泽
2023-03-14

由于您希望开始日期和结束日期都包含在内,所以支票之间的差异应与6进行比较,因为如果结束日期是开始日期之后的6天,则它们涵盖了一整周,例如周一-

当然,您还需要确保结束日期不早于开始日期。

由于一周中的某一天是一个循环刻度,在某个时间点(使用日历时,在周六和周日之间)滚动,因此需要考虑到这一点。

如果结束日期

testDayOfWeek也一样。

与使用if语句不同,总是加上7,然后使用模数7,使代码更简单(更小)。

所以,你的测试是(伪代码):

if (endDate < startDate):
    return false
if (diff(startDate, endDate) >= 6)
    return true
return (testDoW + 7 - startDoW) % 7 <= (endDoW + 7 - startDoW) % 7

姚胡媚
2023-03-14
EnumSet.of( DayOfWeek.MONDAY , DayOfWeek.TUESDAY , DayOfWeek.WEDNESDAY ) 
    .contains(
        myLocalDate.getDayOfWeek()
    )

你的问题不清楚,所以我可能误解了。这似乎是在转移视线,分散注意力。在一周中的某一天,用“从/开始”和“到/停止”来思考只会让人困惑。您似乎只关心某个特定日期的星期几恰好是一组所需的星期几值的成员。

例如,如果你定义“周末”,不要说“星期五和星期五之间的几天”

java.time框架有用于这些目的的类。请使用它们。

DayOfYork枚举携带七个预定义的对象,每个对象用于一周中的一天,星期一-星期日。

EnumSet类是Set的一个实现,它为保存enum对象进行了高度优化。这个类速度非常快,占用的内存非常少。

收集你关心的周值。

Set< DayOfWeek > dows = EnumSet.of( DayOfWeek.MONDAY , DayOfWeek.TUESDAY , DayOfWeek.WEDNESDAY ) ;

获取你的约会对象的工作日。

DayOfWeek dow = myLocalDate.getDayOfWeek() ;

询问场景是否包含一周中的那一天。

Boolean hit = dows.contains( dow ) ;

在代码库中,传递这些DayOfWeekenum和Set对象。避免使用笨拙的表示法,如字符串“Mo”和模糊整数(如1)。

你甚至不需要问题中建议的专用方法。如上图所示,您可以通过一两行清晰的显式代码轻松完成工作,而不是调用其他方法。

你可以使用一周中的一系列工作日的概念,但我认为在你的问题场景中没有优势。

但是如果你坚持,你需要一个清晰的周顺序定义。我建议你遵循国际标准化组织8601标准周定义,从周一开始,一直持续到周日,编号1-7。DayOfYork枚举使用了这个标准定义。

Set< DayOfWeek > dows = EnumSet.range( DayOfWeek.MONDAY , DayOfWeek.WEDNESDAY ) ;  // 3 days, Mon/Tues/Wed.
 类似资料:
  • 问题内容: 我有开始日期和结束日期。 我需要找出星期天或星期一等取决于用户单击复选框的日期。 如何在PHP中查找/计算? 问题答案: 您可以创建一个函数,该函数递归使用strtotime()来计算天数。由于工作正常。 希望这是您正在寻找的东西:)

  • 问题内容: 给定一个特定的日期(例如2011-07-02),我如何找到该日期之后的下一个星期一(或该日的任何工作日)的日期? 问题答案:

  • 问题内容: 因此,对于一个开始日期和结束日期,我想确定在这两个日期之间发生的一周中的特定天数。 那么多少个星期一,星期二等 我知道我可以在“开始日期”和“结束日期”之间循环并每天检查一次,但是可能相差很多天。我更喜欢不需要循环的东西。有任何想法吗?(必须在SQL Server2005+中受支持) 问题答案: 鉴于我 认为 您正在尝试获得的结果,应该这样做:

  • 问题内容: 可能是这样的: 但是可能存在更简单的方法吗?谢谢。 问题答案: 您走在正确的轨道上。 让我仅在星期一进行这项工作。

  • 问题内容: 如果我有特定的星期数(例如51)和给定的年份(例如2008),我如何找到同一周的第一个星期一的日期? 非常感谢 问题答案: 假设一周的第一天是星期一,请使用,而不是一周的第一天是星期日。有关详细信息,请参见strptime文档。 更新: 固定星期数。该指令基于0,因此第51周应输入为50,而不是51。

  • 问题内容: 我假设Java有一些内置的方法可以做到这一点。 给定日期,我如何确定该日期之前一天? 例如,假设给我3/1/2009。上一个日期是2009年2月28日。如果给我3/1/2008,那么以前的日期应该是2/29/2008。 问题答案: 使用日历界面。 以这种方式进行“加法”可确保您获得有效的日期。该日期也于一年的1月1日有效,例如2012年1月1日为2011年12月31日。