簡體   English   中英

"Joda-Time 中兩個日期之間的天數"

[英]Number of days between two dates in Joda-Time

如何找到兩個Joda-Time<\/a> DateTime<\/code><\/a>實例之間的天數差異? 對於“天數差異”,我的意思是如果開始是在星期一,結束是在星期二,我希望返回值 1,而不管開始日期和結束日期的小時\/分鍾\/秒。

Days.daysBetween(start, end).getDays()<\/code>如果開始在晚上並在早上結束,則給我 0。

我對其他日期字段也有同樣的問題,所以我希望有一種通用的方法來“忽略”不太重要的字段。

換句話說,2 月和 3 月 4 日之間的月份也是 1,14:45 和 15:12 之間的時間也是 1。 但是 14:01 和 14:55 之間的小時差將為 0。

令人討厭的是,withTimeAtStartOfDay答案是錯誤的,但只是偶爾。 你要:

Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

事實證明,“午夜/一天的開始”有時意味着凌晨1點(在某些地方以這種方式發生夏令時),Days.daysBetween無法正常處理。

// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
                               end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
                               end.toLocalDate()).getDays());
// prints 1

通過LocalDate回避整個問題。

Days

使用帶有withTimeAtStartOfDay方法的Days類應該可以:

Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays() 

你可以使用LocalDate

Days.daysBetween(new LocalDate(start), new LocalDate(end)).getDays() 

TL;博士

java.time.temporal.ChronoUnit.DAYS.between( 
    earlier.truncatedTo( ChronoUnit.DAYS )  , 
    later.truncatedTo( ChronoUnit.DAYS ) 
)

…要么…

java.time.temporal.ChronoUnit.HOURS.between( 
    earlier.truncatedTo( ChronoUnit.HOURS )  , 
    later.truncatedTo( ChronoUnit.HOURS ) 
)

java.time

僅供參考, Joda-Time項目現在處於維護模式 ,團隊建議遷移到java.time類。

相當於Joda-Time DateTimeZonedDateTime

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

顯然你想按日期計算日期,這意味着你想忽略一天中的時間。 例如,在午夜前一分鍾開始到午夜后一分鍾結束應該會導致一天。 對於此行為,從ZonedDateTime提取LocalDate LocalDate類表示沒有時間且沒有時區的僅日期值。

LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;

使用ChronoUnit枚舉計算已用天數或其他單位。

long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;

截短

至於你問一個更通用的方法來計算你感興趣的小時數增量作為小時的時間而不是60小時的跨度時間,請使用truncatedTo方法。

這是你在同一天14:45到15:12的例子。

ZoneId z = ZoneId.of( "America/Montreal" ); 
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );

long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );

1

對於按日期計算的天數,請截斷為ChronoUnit.DAYS 這是一個例子,從過去的五分鍾到五分鍾后的午夜,過去的一天是1

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 23 , 55 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 18 , 00 , 05 , 0 , 0 , z );

long days = ChronoUnit.DAYS.between( start.truncatedTo( ChronoUnit.DAYS ) , stop.truncatedTo( ChronoUnit.DAYS ) );

1


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.DateCalendarSimpleDateFormat

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

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

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

從哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

接受的答案構建了兩個LocalDate對象,如果您正在閱讀大量數據,這些對象非常昂貴。 我用這個:

  public static int getDaysBetween(DateTime earlier, DateTime later)
  {
    return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
  }

通過調用getMillis()您可以使用已存在的變量。
MILLISECONDS.toDays()然后,使用簡單的算術計算,不創建任何對象。

java.time.Period

使用java.time.Period計算天數

由於Java 8計算差異更直觀,使用LocalDateLocalDateTime來表示兩個日期

    LocalDate now = LocalDate.now();
    LocalDate inputDate = LocalDate.of(2018, 11, 28);

    Period period = Period.between( inputDate, now);
    int diff = period.getDays();
    System.out.println("diff = " + diff);
DateTime  dt  = new DateTime(laterDate);        

DateTime newDate = dt.minus( new  DateTime ( previousDate ).getMillis());

System.out.println("No of days : " + newDate.getDayOfYear() - 1 );    

(KOTLIN) 對於固定日期和當前日期之間的差異 (Joda)<\/strong>

您可以使用Days.daysBetween(jodaDate1,jodaDate2)<\/code>

這是一個例子:

        val dateTime: DateTime = DateTime.parse("14/09/2020",
            DateTimeFormat.forPattern("dd/MM/yyyy"))
        val currentDate = DateTime.now()
        //To calculate the days in between
        val dayCount = Days.daysBetween(dateTime,currentDate).days
        //Set Value to TextView 
        binding.daysCount.text = dayCount.toString()
public static int getDifferenceIndays(long timestamp1, long timestamp2) {
    final int SECONDS = 60;
    final int MINUTES = 60;
    final int HOURS = 24;
    final int MILLIES = 1000;
    long temp;
    if (timestamp1 < timestamp2) {
        temp = timestamp1;
        timestamp1 = timestamp2;
        timestamp2 = temp;
    }
    Calendar startDate = Calendar.getInstance(TimeZone.getDefault());
    Calendar endDate = Calendar.getInstance(TimeZone.getDefault());
    endDate.setTimeInMillis(timestamp1);
    startDate.setTimeInMillis(timestamp2);
    if ((timestamp1 - timestamp2) < 1 * HOURS * MINUTES * SECONDS * MILLIES) {
        int day1 = endDate.get(Calendar.DAY_OF_MONTH);
        int day2 = startDate.get(Calendar.DAY_OF_MONTH);
        if (day1 == day2) {
            return 0;
        } else {
            return 1;
        }
    }
    int diffDays = 0;
    startDate.add(Calendar.DAY_OF_MONTH, diffDays);
    while (startDate.before(endDate)) {
        startDate.add(Calendar.DAY_OF_MONTH, 1);
        diffDays++;
    }
    return diffDays;
}

暫無
暫無

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

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