第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用公歷和 While 循環(huán)計算兩個日期之間的天數(shù)

如何使用公歷和 While 循環(huán)計算兩個日期之間的天數(shù)

茅侃侃 2021-12-10 10:52:30
public class DVD implements Serializable {private static final long serialVersionUID = 1L;protected GregorianCalendar rentedOn;protected GregorianCalendar dueBack;protected String title;protected String nameOfRenter;public double getCost(GregorianCalendar ActualDatRented) {    double cost = 3;    double count = 0;    if (ActualDatRented.after(this.dueBack)) {        while(!dueBack.equals(ActualDatRented)) {            count++;            dueBack.add(Calendar.DATE,1);            cost = cost + count;            return cost;        }    }else if(ActualDatRented.equals(dueBack))        cost = 3;    return cost;  }}此代碼假設(shè)計算dueBack 和ActualDatRented 之間的天數(shù),并在dueBack 日期之后的每一天增加1 美元的成本。它不需要在 while 循環(huán)中,但我認為它會更容易編寫,但我知道如果在 while 循環(huán)中編寫,它將必須每天循環(huán),直到 ActualDatRented 等于 DueBack 日期和添加 1 以計算每個循環(huán)的成本。我如何使此代碼工作?
查看完整描述

2 回答

?
白豬掌柜的

TA貢獻1893條經(jīng)驗 獲得超10個贊

為了回答您的問題,您的代碼在一個循環(huán)后停止的原因是returnwhile 循環(huán)末尾的語句。此外,如果dueBack與 相同ActualDateRented,它將根據(jù)您的 else 語句返回 3。

但是這段代碼還有其他一些問題。您正在dueBackActualDateRentedusing進行比較!=,它用于對象檢查它們是否是完全相同的對象,而不是比較值。您應(yīng)該使用該equals方法來比較日期。

從更一般的意義上說,您使用GregorianCalendarJava 8 的日期/時間 API是否有特殊原因?“新”API 更易于使用,您無需編寫自己的循環(huán)來確定天之間的差異。您可以查看https://www.baeldung.com/java-8-date-time-intro了解更多信息。


查看完整回答
反對 回復(fù) 2021-12-10
?
守著星空守著你

TA貢獻1799條經(jīng)驗 獲得超8個贊

數(shù)天。


ChronoUnit.DAYS.between( 

    myGregorianCalendar_Start.toZonedDateTime().toLocalDate() , 

    myGregorianCalendar_Stop.toZonedDateTime().toLocalDate() 

)

比較。


if( 

     myGregorianCalendar_Start.toZonedDateTime().toLocalDate()

     .isBefore( 

          myGregorianCalendar_Stop.toZonedDateTime().toLocalDate()

     )

) { … }

做數(shù)學(xué)。(未經(jīng)測試的代碼,用作概念指南,實際上需要根據(jù)您的業(yè)務(wù)規(guī)則指定四舍五入到一美分或十分之一美分)


new BigDecimal( "3" )  // Base cost.

.add( 

    new BigDecimal(

        ChronoUnit.DAYS.between(  // Calculate days overdue.

            myGregorianCalendar_Start.toZonedDateTime().toLocalDate() , 

            myGregorianCalendar_Stop.toZonedDateTime().toLocalDate() 

         )

    )

    .multiply(

        new BigDecimal( "1.5" )  // Daily overdue fee.

    )

)

細節(jié)

瑞克的答案是正確的,應(yīng)該被接受。


正如他指出的那樣,您正在使用糟糕的舊日期時間類 ( GregorianCalendar),這些類在多年前被JSR 310 中定義的java.time類取代。


該GregorianCalendar班所取代ZonedDateTime。您應(yīng)該完全避免使用舊類。但是當需要與尚未更新為java.time 的舊代碼進行交互時,您可以使用添加到舊類的新方法進行轉(zhuǎn)換。


ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime() ;

然后再回來。


GregorianCalendar myGregorianCalendar = GregorianCalendar.from( zdt ) ;

ZonedDateTime手頭有一個對象,您可以提取僅日期部分,而無需時間和時區(qū)。


LocalDate ld = zdt.toLocalDate() ;

使用ChronoUnit枚舉計算經(jīng)過的天數(shù)。


long days = ChronoUnit.DAYS.between( ldStart , ldStop ) ;

請注意,結(jié)果是long(64 位整數(shù)),而不是 32 位int,因此如果與其他需要int.


int days = ( int ) ChronoUnit.DAYS.between( ldStart , ldStop ) ;

BigDecimal

順便說一句,在實際工作中,永遠不要使用double或Double也不要float或Float為金錢。這些類型使用浮點技術(shù),以犧牲準確性來獲得快速性能。


在任何準確性很重要的上下文中,例如處理金錢,只使用慢但準確的類BigDecimal。


查看完整回答
反對 回復(fù) 2021-12-10
  • 2 回答
  • 0 關(guān)注
  • 250 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號