2014-12-15 2 views
-3

В Java, как мне приступить к созданию утилиты, которая будет принимать ряд дат (дата начала и окончания) и затем увидит, сколько раз в этом диапазоне появится данная частичная дата (месяц и день месяца) и добавит запись в список для каждого совпадения.Сколько экземпляров частичной даты (месяца и дня) отображается в диапазоне и в день недели

В моем случае, я хочу дать ему диапазон от 5 лет - начиная с 1 января 2014 года и до 31 декабря 2019 года. Моя контрольная дата - 2 августа. Я хочу, чтобы метод возвращал полную информацию о каждом матче любого 2 августа любого года в диапазоне. Так что в 2014 году он вернется в субботу 2 августа 2014 года, затем в воскресенье 2 августа 2015 года и т. Д. И так далее.

Я пытаюсь получить что-то работающее с Joda Time и классы даты/календаря по умолчанию на Java, и я просто чувствую себя в беспорядке.

Спасибо, S

Edit: Как глупо с моей стороны, извинения за не добавляя свой код :(

public static List<Date> getDaysInRange(Date startdate, 
             Date enddate, 
             Date checkDate) { 
    SimpleDateFormat sdf = new SimpleDateFormat("MMdd"); 
    List<Date> dates = new ArrayList<>(); 
    Calendar cal = new GregorianCalendar(); 
    cal.setTime(startdate); 

    while (cal.getTime().before(enddate)) { 
     if (sdf.format(cal.getTime()).equals(sdf.format(checkDate))) { 
     Date result = cal.getTime(); 
     dates.add(result); 
     } 
     cal.add(Calendar.DATE, 1); 
    } 
    return dates; 
} 
+2

Письменный код будет хорошим началом. Мы не здесь, чтобы твоя работа для тебя. Вы показываете, что вы написали, мы, возможно, попробуем помочь исправить это. –

+0

Добавил мой код до сих пор, я думаю, что это вроде работает, но просто чувствует себя немного неуклюжим для меня :( – Stuie

+0

Метод работает для меня. В чем проблема? – Compass

ответ

0

Дата-Only

Sinc e вы хотите только дату без времени суток и без часового пояса, используйте класс только для даты. В старых классах java.util.Date/.Calendar отсутствует такой класс. И эти старые классы, как известно, хлопотно и испорчены.

Вместо этого используйте либо:

Joda время

Вот некоторый непроверенный код с помощью Joda-Time 2.6.

Основная идея состоит в том, чтобы сосредоточиться на небольшом наборе возможных цифр года, а не на тестировании каждый день года. В приведенном ниже примере это означает шесть значений даты и времени для сравнения, а не тысячи. Помимо эффективности, цель кода становится более очевидной.

Аргументы к вашей рутине должны быть числом месяца и числом дня месяца, парой целых чисел или целыми числами, а не датой. Как видно из этих примеров, две переменные int, month и day.

LocalDate start = new LocalDate(2011, 2, 3); 
LocalDate stop = new LocalDate(2016, 4, 5); 
int yearStart = start.getYear(); 
int yearStop = stop.getYear(); 
int month = 11; 
int day = 22; 

for (i = yearStart, i <= yearStop, i++) 
{ 
    LocalDate x = new LocalDate(i, month, day); 
    boolean matchStart = (x.isEqual(start) || x.isAfter(start)); 
    boolean matchStop = x.isBefore(stop); // Half-Open approach where beginning of range is inclusive while ending is exclusive. 
    if (matchStart && matchStop) 
    { 
     // Add to collection of LocalDate objects. 
     // Later you can ask each LocalDate object for its day-of-week. 
    { 
} 

java.time

Пакет java.time также предлагает LocalDate класс. Код будет похож на приведенный выше пример Joda-Time.

0

Я думаю, с помощью SimpleDateFormat это плохая идея использовать календарь для сравнения непосредственно, как. это

cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH) && cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH) 
Смежные вопросы