【问题标题】:Get the Week day List in a Month For specified week day获取指定工作日的一个月中的工作日列表
【发布时间】:2013-12-29 08:35:55
【问题描述】:

我需要准备一个工作日日期列表

注意:- 工作日不是星期六或星期日,(我可以将工作日作为参数传递)

我已经编写了以下代码但无法正常工作, 能否请您更正代码

public static void main (String[] args) {

  List weekoffDates = new ArrayList<Timestamp>();
  Timestamp date = "2013-12-01 00:00:00.0"; //This is timestamp object not string
  Timestamp endDate = "2013-12-31 00:00:00.0"; //This is timestamp object not string
  int dayOfWeek  = 3 //TuesDay

  for ( int i =1 ; i<=5; i++ ) {
    if( ! date.after(endDate) ) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(date.getTime());
        calendar.set( Calendar.DAY_OF_WEEK, dayOfWeek  );  //This is my parameter
        //calendar.set( Calendar.WEEK_OF_MONTH, i );        
        date = new Timestamp( calendar.getTimeInMillis() );
        weekoffDates.add(date); 
        dayOfWeek = dayOfWeek +7;
        System.out.println(date);
    }
    System.out.println(weekoffDates);  
  }
}

编辑:-
日期 :- 2013:December:1 (我已作为 Timestamp 对象发送)
EndDate :- 2013:December:31(我已作为 Timestamp 对象发送)
dayOfWeek :- 这是星期几(我已经在星期二 3 发送了这个参数) //它会动态变化
预期结果:-
十二月的所有星期二为 ArrayListlist
问题:- calendar.set( Calendar.DAY_OF_WEEK, dayOfWeek );设置错误

【问题讨论】:

  • 不,它没有给出预期的结果例如 2013 年 12 月 1 日作为日期,endDate 是 2013 年 12 月 31 日,星期二作为休息日
  • 请发布一个简短但完整的程序来演示问题,以及预期和实际结果。我还强烈建议您考虑使用 Joda Time 作为更好的日期/时间 API。
  • 谢谢乔恩,我认为这是一个非常简单的要求,我可以用 java 日历和时间戳来实现。我一定会用我之前的评论更新这个问题
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Date、java.util.Calendar 和 java.text.SimpleTextFormat 现在是 legacy,被 java.time 类取代。见Tutorial by Oracle。

标签: java date calendar timestamp


【解决方案1】:

您必须在开始日和结束日之间的天数上进行迭代。在迭代循环中,您可以检查您需要存储的日期,然后将其存储在您的列表中。

下面是一个粗略的工作示例,您可以根据您的最佳实践或您可能想要使用的不同数据类型对其进行修改:

public static void main(String[] args) {
        List<String> workDays = new ArrayList<String>();
        int dayOfWeek  = 3; //TuesDay

        Calendar startDate = Calendar.getInstance();
        Calendar endDate = Calendar.getInstance();

        startDate.set(2013, 11, 1);
        endDate.set(2013, 11, 31);

        while (startDate.getTimeInMillis() <= endDate.getTimeInMillis()) {
            if (startDate.get(Calendar.DAY_OF_WEEK) == dayOfWeek) {
                workDays.add(startDate.getTime().toString());
                System.out.println(startDate.getTime());
            }
            startDate.add(Calendar.DAY_OF_MONTH, 1);
        }


    }

请注意,硬编码的开始日期和结束日期的月份参数为 11,因为 java.util.Calendar 下的一月 = 0

【讨论】:

    【解决方案2】:

    java.time

    现代方法使用 java.time 类而不是麻烦的遗留类,例如 Date 和 Calendar。

    您似乎在询问特定月份中同一天的日期序列。因此,您无需重复所有单独的日期,因为我们知道它们正好相隔 7 天。您只需找到所需星期几的第一个日期,然后一次添加一周。

    LocalDate 类表示没有时间和时区的仅日期值。

    DayOfWeek dow = DayOfWeek.WEDNESDAY ;
    YearMonth ym = YearMonth.of( 2013 , Month.DECEMBER ) ;
    
    LocalDate firstOfMonth = ym.atDay( 1 );
    LocalDate firstDowOfMonth = firstOfMonth.with( TemporalAdjusters.nextOrSame( dow ) ) ;
    
    List< LocalDate > dates = new ArrayList<>( 5 );   // A month has a maximum of five occurrences of a day-of-week.
    LocalDate ld = firstDowOfMonth ;
    do {
        dates.add( ld ) ;
        // Set up the next loop.
        ld = ld.plusWeeks( 1 );
    } while ( YearMonth.from( ld ).equals( ym ) ) ;  // Continue while in the desired month.
    

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

    【讨论】:

      【解决方案3】:

      我已经更新了上面(我已经提到过)代码如下。
      此代码 sn-p 也给出了正确的结果。 (这里不需要迭代一个月的所有日期)

      public static void main(String[] args) {
      
            List weekoffDates = new ArrayList<Timestamp>();
            Timestamp fromDate = getTimestamp(2013, 12, 1);
            Timestamp endDate  = getTimestamp(2013, 12, 31);
            int dayOfWeek  = 4; //Wednes Day
            int maxWeeksInAMonth  =   5;
            Timestamp tempDate    =   fromDate;
              for ( int i =1 ; i<=maxWeeksInAMonth; i++ ) {
                  Calendar calendar = Calendar.getInstance();
                  calendar.setTimeInMillis(fromDate.getTime());
                  calendar.set( Calendar.DAY_OF_WEEK, dayOfWeek  );
                  calendar.set( Calendar.WEEK_OF_MONTH, i );
                  tempDate = new Timestamp( calendar.getTimeInMillis() );
                  if ( ( tempDate.compareTo(endDate) <= 0 ) 
                               && ( tempDate.compareTo(fromDate) >=0 ) )  {
                      weekoffDates.add(tempDate); 
                      System.out.println(tempDate);
                  }
              }
              System.out.println(weekoffDates);
      } // main
      
      static Timestamp getTimestamp(int year, int month, int day) {
          Calendar cal = Calendar.getInstance();
          cal.set(year, month - 1, day);
          return new Timestamp(cal.getTimeInMillis());
      } // getTimestamp
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        • 2020-09-15
        • 2012-01-13
        • 2022-06-10
        • 1970-01-01
        • 2014-04-30
        相关资源
        最近更新 更多