Java: Получите дни в первую неделю каждые 3 месяца в диапазоне датJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Гость
 Java: Получите дни в первую неделю каждые 3 месяца в диапазоне дат

Сообщение Гость »

Например: диапазон дат с 3 января 2013 года по 3 октября 2013 года.
в диапазоне выше, получает все будние дни первой недели каждых 3 месяцев. Результат будет таким: < /p>

Код: Выделить всё

Thu Jan 03 00:00:00 ICT 2013
Fri Jan 04 00:00:00 ICT 2013
Sat Jan 05 00:00:00 ICT 2013
Sun Jan 06 00:00:00 ICT 2013
Mon Jan 07 00:00:00 ICT 2013
Mon Apr 01 00:00:00 ICT 2013
Tue Apr 02 00:00:00 ICT 2013
Wed Apr 03 00:00:00 ICT 2013
Thu Apr 04 00:00:00 ICT 2013
Fri Apr 05 00:00:00 ICT 2013
Sat Apr 06 00:00:00 ICT 2013
Sun Apr 07 00:00:00 ICT 2013
Mon Jul 01 00:00:00 ICT 2013
Tue Jul 02 00:00:00 ICT 2013
Wed Jul 03 00:00:00 ICT 2013
Thu Jul 04 00:00:00 ICT 2013
Fri Jul 05 00:00:00 ICT 2013
Sat Jul 06 00:00:00 ICT 2013
Sun Jul 07 00:00:00 ICT 2013
Tue Oct 01 00:00:00 ICT 2013
Wed Oct 02 00:00:00 ICT 2013
< /code>
Если диапазон с 15 января 2013 года по 15 октября 2013 года, то он будет начат с 1 февраля и следующие 3 месяца, 1 мая и так далее. Учитывая диапазон дат, месяц и набор будни (понедельник -> воскресенье), мне нужно распечатать все дни, которые удовлетворяют условиям: они находятся в диапазоне дат, они являются одним из недель, и они являются разделены месяцами. К будным дням я имел в виду, что все дни недели. Приведенный выше пример - все с понедельника по воскресенье первой недели каждых 3 месяцев. Код, который я написал, может быть применен для получения с понедельника по воскресенье третьей недели каждые 2 месяца для другого примера. Месяцы тоже могут быть изменены. Вместо каждые 3 месяца, это может быть каждые 2 месяца, или 4 месяца и т. Д. Есть какой -либо метод, который будет более элегантным? Спасибо за вашу помощь, я действительно оценил это. < /P>
// set up the startCal and endCal
String fmtShowTime = "ddMMyy"; // TODO: move to configurations
SimpleDateFormat sdf = new SimpleDateFormat(fmtShowTime);
TimeZone defaultZone = TimeZone.getDefault();
sdf.setTimeZone(defaultZone);
String fromTime = "030113";
String toTime = "031013";
Date startDate = sdf.parse(fromTime);
Date endDate = sdf.parse(toTime);
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDate);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);

// set up the condition for week and month
Integer week = Integer.parseInt("1"); // first week
Integer monthPeriod = Integer.parseInt("3"); // every 3 months
Integer counter = 0;

while (startCal.getTimeInMillis() < endCal.getTimeInMillis()) {
if (startCal.get(Calendar.DAY_OF_WEEK_IN_MONTH) == week) {
// check if the current day in loop is the day of first week in month
if (monthPeriod == 1)  {
// get for every month
for (int i = 0; i < 7; i++) {
if (startCal.get(Calendar.DAY_OF_WEEK_IN_MONTH) != week || startCal.getTimeInMillis() == endCal.getTimeInMillis()) {
// break for case like Tuesday, January 8th (2nd Tuesday of January) or October 4th (range breached)
break;
}
System.out.println(startCal.getTime());
// move 1 more day
startCal.add(Calendar.DAY_OF_MONTH, 1);
}
}
else {
counter++;
if (counter % monthPeriod == 1) {
// I used counter mod monthPeriod to check if 3 months has passed in the loop, 1%3 = 1, 4%3 = 1 and so on
for (int i = 0; i < 7; i++) {
if (startCal.get(Calendar.DAY_OF_WEEK_IN_MONTH) != week || startCal.getTimeInMillis() == endCal.getTimeInMillis()) {
// break for case like Tuesday, January 8th (2nd Tuesday of January) or October 4th (range breached)
break;
}
System.out.println(startCal.getTime());
// move 1 more day
startCal.add(Calendar.DAY_OF_MONTH, 1);
}
} else {
//if it's the first week of a month but not 3 months has passed yet then I forward 7 days to pass the check for first week of the month
startCal.add(Calendar.DAY_OF_MONTH, 7);
}
}
}
startCal.add(Calendar.DAY_OF_MONTH, 1);
}
p.s, извините, если код вызвал у вас мрачный, я знаю, что это плохо :)

Подробнее здесь: https://stackoverflow.com/questions/143 ... date-range
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»