Время Joda: Как получить даты дней недели на некотором интервале дат? - PullRequest
3 голосов
/ 28 декабря 2010

У меня есть две LocalDates, которые представляют некоторый интервал времени. Теперь я должен получить LocalDates всех пятниц, что этот интервал содержит. Самый простой способ сделать это?

Ответы [ 3 ]

6 голосов
/ 28 декабря 2010
package org.life.java.so.questions;

import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;

/**
 *
 * @author Jigar
 */
public class JodaTimeDateTraverseQuestion {
    public static void main(String[] args) {

        DateTime startDt = new DateTime(2010,12,1,0,0,0,0);//1st Dec 2010
        DateTime endDt = new DateTime(2010,12,31,0,0,0,0);//31st Dec 2010
        DateTime tempDate = new DateTime(startDt.getMillis());
        while(tempDate.compareTo(endDt) <=0 ){
            if(tempDate.getDayOfWeek() !=  DateTimeConstants.SATURDAY && tempDate.getDayOfWeek() !=  DateTimeConstants.SUNDAY){
                System.out.println(""+tempDate);
            }
            tempDate = tempDate.plusDays(1);

        }


    }
}
4 голосов
/ 28 декабря 2010

Решение: лениво шаг за неделю.

import org.joda.time.LocalDate;
import java.util.Iterator;

public class DayOfWeekIterator implements Iterator<LocalDate>{
    private final LocalDate end;
    private LocalDate nextDate;

    public DayOfWeekIterator(LocalDate start, LocalDate end, int dayOfWeekToIterate){
        this.end = end;
        nextDate = start.withDayOfWeek(dayOfWeekToIterate);
        if (start.getDayOfWeek() > dayOfWeekToIterate) {
            nextDate = nextDate.plusWeeks(1);
        }
    }

    public boolean hasNext() {
        return !nextDate.isAfter(end);
    }

    public LocalDate next() {
        LocalDate result = nextDate;
        nextDate = nextDate.plusWeeks(1);
        return result;
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
 }

Тест

import org.joda.time.DateTimeConstants;
import org.joda.time.LocalDate;

public class DayOfWeekIteratorTest {

    public static void main(String[] args) {

        LocalDate startDate = new LocalDate(2010, 12, 1);//1st Dec 2010
        LocalDate endDate = new LocalDate(2010, 12, 31);//31st Dec 2010
        DayOfWeekIterator it = new DayOfWeekIterator(startDate, endDate, DateTimeConstants.FRIDAY);
        while (it.hasNext()) {
            System.out.println(it.next());
        }

    }
}
0 голосов
/ 05 марта 2018

tl; др

java.time.LocalDate.of( 2018 , Month.JANUARY , 23 )  // A date-only class in the modern *java.time* classes that supplant both Joda-Time and the troublesome old date-time classes.
    .with(  
        TemporalAdjusters.next( DayOfWeek.FRIDAY )   // Nifty `TemporalAdjuster` implementation for moving to another date. Immutable Objects pattern means a new object is returned based on the original which remains unmodified.
    )
    .isBefore(                                       // Compare `LocalDate` objects with `isBefore`, `isAfter`, and `isEqual`. 
        LocalDate.of( 2018 , Month.FEBRUARY , 27 );
    )

java.time

К вашему сведению, проект Joda-Time сейчас находится на обслуживаниирежим , с командой, советующей перейти на классы java.time .

Определите ваши остановки и запуска LocalDate объектов.

LocalDate start = LocalDate.of( 2018 , Month.JANUARY , 23 );
LocalDate stop = LocalDate.of( 2018 , Month.FEBRUARY , 27 );
// TODO: Verify start.isBefore( stop ).

Соберите даты пятницы, которые мы находим.Вы можете немного оптимизировать размер коллекции.

// Pre-size the collection.
int initialCapacity = ( int ) ( ChronoUnit.WEEKS.between( start , stop ) + 2 ); // Adding two for good measure.
List < LocalDate > fridays = new ArrayList <>( initialCapacity );

Определите первую пятницу, используя дату начала, если она сама является пятницей.Используйте пару TemporalAdjuster реализаций, предлагаемых в классе TemporalAdjusters: next​(DayOfWeek) & nextOrSame​(DayOfWeek).Передайте желаемый день недели через перечисление DayOfWeek, семь предопределенных объектов, по одному на каждый день недели с понедельника по воскресенье.

LocalDate friday = start.with( TemporalAdjusters.nextOrSame( DayOfWeek.FRIDAY ) );

while ( friday.isBefore( stop ) )
{
    fridays.add( friday );  // Remember this Friday date.
    // Setup next loop.
    friday = friday.with( TemporalAdjusters.next( DayOfWeek.FRIDAY ) );
}

System.out.println( "From " + start + " to " + stop + " = " + fridays );

С 2018-01-23до 2018-02-27 = [2018-01-26, 2018-02-02, 2018-02-09, 2018-02-16, 2018-02-23]


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , а затем
    • Встроенный-в.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android классов java.time.
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Бэкпорт (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

...