我需要准备一个工作日日期列表
注意: - 周日不是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);设置错误
答案 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)
我已在上面更新了(我已经提到过)代码,如下所示。
此代码片段也给出了正确的结果。 (这里不需要迭代一个月的所有日期)
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类而不是麻烦的遗留类,例如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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; 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。