2 回答

TA貢獻1893條經(jīng)驗 獲得超10個贊
為了回答您的問題,您的代碼在一個循環(huán)后停止的原因是return
while 循環(huán)末尾的語句。此外,如果dueBack
與 相同ActualDateRented
,它將根據(jù)您的 else 語句返回 3。
但是這段代碼還有其他一些問題。您正在dueBack
與ActualDateRented
using進行比較!=
,它用于對象檢查它們是否是完全相同的對象,而不是比較值。您應(yīng)該使用該equals
方法來比較日期。
從更一般的意義上說,您使用GregorianCalendar
Java 8 的日期/時間 API是否有特殊原因?“新”API 更易于使用,您無需編寫自己的循環(huán)來確定天之間的差異。您可以查看https://www.baeldung.com/java-8-date-time-intro了解更多信息。

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。
添加回答
舉報