#java #calendar
#java #Календарь
Вопрос:
Я хочу взять всю субботу и воскресенье из заданного диапазона дат…
мои входные данные
Дата начала: 01/01/2011 Дата окончания: 01/01/2012
теперь дата поиска, которая находится между заданной датой начала и датой окончания, и днем будет суббота или воскресенье.
Пожалуйста, предложите…
Комментарии:
Ответ №1:
Во-первых, я бы рекомендовал использовать время Joda, если это возможно. Это гораздо лучший API даты и времени, чем тот, который встроен в Java.
Во-вторых, если вы действительно не беспокоитесь об эффективности, я бы лично выбрал невероятно простой, но несколько расточительный подход, заключающийся в простом повторении каждого дня за период времени, включая те, которые приходятся на нужные дни. Чередование добавления одного дня и добавления шести дней, безусловно, было бы более эффективным, но его сложнее изменить.
Пример кода:
import java.util.*;
import org.joda.time.*;
public class Test
{
public static void main(String[] args)
{
List<LocalDate> dates = getWeekendDates
(new LocalDate(2011, 1, 1), new LocalDate(2011, 12, 1));
for (LocalDate date : dates)
{
System.out.println(date);
}
}
private static List<LocalDate> getWeekendDates
(LocalDate start, LocalDate end)
{
List<LocalDate> result = new ArrayList<LocalDate>();
for (LocalDate date = start;
date.isBefore(end);
date = date.plusDays(1))
{
int day = date.getDayOfWeek();
// These could be passed in...
if (day == DateTimeConstants.SATURDAY ||
day == DateTimeConstants.SUNDAY)
{
result.add(date);
}
}
return resu<
}
}
Ответ №2:
Я рекомендую взглянуть на эту библиотеку Java с открытым исходным кодом RFC-2445. Вы можете создать правило еженедельного повторения с повторением в субботу и воскресенье, а затем выполнить итерацию по указанному периоду, чтобы получить все даты.
Ответ №3:
Я думаю, вы можете использовать следующий способ — это действительно просто, и вам не нужно использовать другие библиотеки.
Возьмите номер дня недели (для понедельника = 1, воскресенье = 7). Затем — выберите новую начальную дату, которая является первым воскресным событием -> это StartDate (7 — weekdayNum). По тому же алгоритму вы можете взять последнее воскресенье из интервала (я думаю, путем вычитания EndDate — weekdayNum — 1). И теперь вы можете перейти в цикл for через все события (используйте инкрементный шаг 7). Или, если вам нужно конкретное событие, например, 3-е воскресенье, вы можете просто выполнить newStartDate 3 * 7 .
Надеюсь, это понятно. Я не уверен, верны ли цифры. Надеюсь, это поможет понять проблему.
Ответ №4:
Вот полный пример. Пожалуйста, предложите, можем ли мы сделать это лучше.
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
*
* @author varun.vishwakarma
*/
public class FindWeekendsInDateRange {
static HashMap<Integer, String> daysOfWeek=null;
static {
daysOfWeek = new HashMap<Integer, String>();
daysOfWeek.put(new Integer(1), "Sun");
daysOfWeek.put(new Integer(2), "Mon");
daysOfWeek.put(new Integer(3), "Tue");
daysOfWeek.put(new Integer(4), "Wed");
daysOfWeek.put(new Integer(5), "Thu");
daysOfWeek.put(new Integer(6), "Fri");
daysOfWeek.put(new Integer(7), "Sat");
}
/**
*
* @param from_date
* @param to_date
* @return
*/
public static List<Date> calculateWeekendsInDateReange(Date fromDate, Date toDate) {
List<Date> listOfWeekends = new ArrayList<Date>();
Calendar from = Calendar.getInstance();
Calendar to = Calendar.getInstance();
from.setTime(fromDate);
to.setTime(toDate);
while (from.getTimeInMillis() < to.getTimeInMillis()) {
if (daysOfWeek.get(from.get(Calendar.DAY_OF_WEEK)) == "Sat") {
Date sat = from.getTime();
listOfWeekends.add(sat);
} else if (daysOfWeek.get(from.get(Calendar.DAY_OF_WEEK)) == "Sun") {
Date sun = from.getTime();
listOfWeekends.add(sun);
}
from.add(Calendar.DAY_OF_MONTH, 1);
}
return listOfWeekends;
}
public static void main(String[] args) {
String fromDate = "7-Oct-2019";
String toDate = "25-Oct-2019";
System.out.println(FindWeekendsInDateRange.calculateWeekendsInDateReange(new Date(fromDate), new Date(toDate)));
}
}
Ответ №5:
Я предполагаю, что ваши даты начала и окончания указаны в миллисекундах. Перебирайте даты и проверяйте, являются ли дни 'Saturday'
или 'Sunday'
. Ниже я возвращаю общее количество субботы и воскресенья в заданном диапазоне дат.
private int totalWeekendDays(long start, long end)
{
int result=0;
long dayInMS = TimeUnit.DAYS.toMillis(1);
for (long i = start; i<=end; i = i dayInMS)
{
String dayOfTheWeek = (String) DateFormat.format("EEEE", i);
if (dayOfTheWeek.equals("Sunday")||dayOfTheWeek.equals("Saturday"))
{
result = result 1;
}
}
return resu<
}