获取每月的工作日列表指定的工作日

时间:2013-12-29 08:35:56

标签: java date calendar timestamp

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

注意: - 周日不是satudrday或sunday,(我可以将周日作为参数传递)

我写过以下代码但没有工作, 你能否修改一下代码

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年:12月:1(我已发送时间戳对象)
完日日期: - 2013年:12月:31(我已发送时间戳对象)
dayOfWeek: - 这是星期几(我已将此参数发送到星期二3)//它会动态变化
预期结果: -
所有星期二在decemer的月份作为ArrayListlist
问题: - calendar.set(Calendar.DAY_OF_WEEK,dayOfWeek);设置错误

3 个答案:

答案 0 :(得分:2)

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

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

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

下的1月= 0

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

java.time

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

您似乎要求在特定月份内的同一天的一系列日期。所以你不需要迭代所有的日期,因为我们知道它们相隔七天。您只需要找到所需日期的第一个日期,然后一次添加一周。

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.DateCalendar和&amp; SimpleDateFormat

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore