簡體   English   中英

Joda 時間 - 兩個日期之間的所有星期一

[英]Joda time - all mondays between two dates

我第一次在 Spring 3.0 項目中使用 Joda time api。 現在我有一個開始和結束日期,我想獲得這兩個日期之間所有星期一的日期。 我怎樣才能做到這一點 ?

我不知道從哪里開始,有人可以建議。 我看了喬達時間的帖子:如何在某個日期間隔內獲取工作日的日期? 它提供了某種指導,但由於對 joda 的經驗很少,它仍然有些模糊。

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);
}

我最近開發了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)

僅供參考, 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類(注意復數名稱)提供了各種實現。 我們想要nextOrSamenext調整器,傳遞所需的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 );
}

順便說一句,通常處理時間跨度的明智方法是半開式,其中開頭是包容性的,而結尾是排斥性的 所以在上面的代碼中,我們正在運行,但不包括stop日期。

如果結尾包含在內,則使用isAfter的否定,例如

while( !monday.isAfter( stop ) ) {
    //...
}

在這里, monday是不是以后stop手段是以前或高達stop


關於java.time

java.time框架內置於 Java 8 及更高版本中。 這些類取代麻煩的老傳統日期時間類,如java.util.DateCalendar ,和SimpleDateFormat

要了解更多信息,請參閱Oracle 教程 並在 Stack Overflow 上搜索許多示例和解釋。 規范是JSR 310

現在處於維護模式Joda-Time項目建議遷移到java.time類。

您可以直接與您的數據庫交換java.time對象。 使用符合JDBC 4.2或更高版本的JDBC 驅動程序 不需要字符串,不需要java.sql.*類。 Hibernate 5 & JPA 2.2 支持java.time

從哪里獲得 java.time 類?

此代碼需要字符串日期並給出星期日的數量以及所有星期日的日期

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"));
}

}

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));
    }
}

在 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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM