Время Joda - все понедельники между двумя датами - PullRequest
7 голосов
/ 07 ноября 2011

Я впервые использую Joda time api в проекте Spring 3.0. Теперь у меня есть дата начала и окончания, и я хочу получить дату для всех понедельников между этими двумя датами. Как я могу это сделать ?

Понятия не имею, с чего начать, может кто-нибудь посоветует, пожалуйста. Я посмотрел на этот пост Время Joda: как узнать даты будних дней на каком-то интервале дат? , и он дал какое-то руководство, но все еще несколько расплывчато из-за небольшого опыта работы с joda.

Ответы [ 6 ]

12 голосов
/ 08 ноября 2011
LocalDate startDate = new LocalDate(2011, 11, 8);
LocalDate endDate = new LocalDate(2012, 5, 1);

LocalDate thisMonday = startDate.withDayOfWeek(DateTimeConstants.MONDAY);

if (startDate.isAfter(thisMonday)) {
    startDate = thisMonday.plusWeeks(1); // start on next monday
} else {
    startDate = thisMonday; // start on this monday
}

while (startDate.isBefore(endDate)) {
    System.out.println(startDate);
    startDate = startDate.plusWeeks(1);
}
4 голосов
/ 27 июня 2014

Я недавно разработал Lamma , который предназначен для решения именно этого варианта использования:

Dates.from(2011, 11, 8).to(2011, 12, 30).byWeek().on(DayOfWeek.MONDAY).build();

и вы получите List<Date> из:

Date(2011,11,14)
Date(2011,11,21)
Date(2011,11,28)
Date(2011,12,5)
Date(2011,12,12)
Date(2011,12,19)
Date(2011,12,26)
2 голосов
/ 08 февраля 2017

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

Использование java.time

Класс LocalDate является java.time сродни Joda-Time LocalDate.Значение только для даты, без времени суток и без часового пояса.Одно из отличий состоит в том, что java.time не использует конструкторы для фабричных методов.

LocalDate start = LocalDate.of( 2011 , 11 , 8 );
LocalDate stop = LocalDate.of( 2012 , 5 , 1 );

Собираем понедельники.

List<LocalDate> mondays = new ArrayList<>();

Интерфейс TemporalAdjuster предоставляет классы,манипулировать значениями даты и времени.Класс TemporalAdjusters (обратите внимание на имя во множественном числе) предоставляет различные реализации.Нам нужны регуляторы nextOrSame и next, передавая требуемый объект перечисления DayOfWeek.MONDAY.

LocalDate monday = start.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) );
while( monday.isBefore( stop ) ) {
    mondays.add( monday );
    // Set up the next loop.
    monday = monday.plusWeeks( 1 );
}

ПоКстати, обычно мудрым подходом к обработке промежутка времени является Half-Open, где начало включительно , а окончание эксклюзивно .Таким образом, в приведенном выше коде мы запускаем, но не включаем, дату stop.


О java.time

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

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

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

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

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

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

2 голосов
/ 17 декабря 2014

Этот код принимает строковые даты и дает число воскресений, а также все даты воскресенья

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class FindAllSundays {


public static int getNumberofSundays(String d1, String d2) throws Exception { // object
                                                                                // in
                                                                                // Date
                                                                                // form

    Date date1 = getDate(d1);
    Date date2 = getDate(d2);

    Calendar c1 = Calendar.getInstance();
    c1.setTime(date1);
    Calendar c2 = Calendar.getInstance();
    c2.setTime(date2);
    int sundays = 0;
    while (c2.after(c1)) {
        // System.out.println(" came here ");
        //checks to see if the day1 ....so on next days are sundays if sunday goes inside to increment the counter
        if (c1.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            System.out.println(c1.getTime().toString() + " is a sunday ");
            sundays++;

        }
        c1.add(Calendar.DATE, 1);
    }

    System.out.println("number of sundays between 2 dates is " + sundays);

    return sundays;
}
// converts string to date 
public static Date getDate(String s) {
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date date = null;
    try {
        date = format.parse(s);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return date;
}

public static void main(String[] arg) throws Exception {
    System.out.println(" " + getNumberofSundays("2005-10-07", "2006-10-01"));
}

}

1 голос
/ 05 августа 2016
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class Get_time {

    public  ArrayList<LocalDate> getmondays(String s,String e)
    {
        LocalDate start = LocalDate.parse(s);
        LocalDate end = LocalDate.parse(e);
        List<LocalDate> totalDates_Mondays = new ArrayList<>();

        while (!start.isAfter(end)) {
            totalDates_Mondays.add(start);
            start = start.plusWeeks(1);
        }
        return (ArrayList<LocalDate>) totalDates_Mondays;
    }

    public static void main(String ...s1) {

        String mon_start = "1600-08-01";
        String mon_end= "2016-12-29";
        Get_time t=new Get_time();
        System.out.println(t.getmondays(mon_start,mon_end));
    }
}
0 голосов
/ 02 июля 2019

В Java 8 с использованием Stream,

LocalDate startDate = LocalDate.of(2019, 2, 1);
LocalDate endDate = LocalDate.of(2019, 2, 28);
long numOfDays = ChronoUnit.DAYS.between(startDate, endDate);
List<LocalDate> daysRange = Stream.iterate(startDate, date -> date.plusDays(1)).limit(numOfDays).filter( date -> date.getDayOfWeek()==DayOfWeek.MONDAY ).collect(Collectors.toList());
...