Java的日期计算方法
我有一个交付项目,其中包含以下类名:
FoodItem
Location
Route
Store
Vehicle
Warehouse
Launcher(包括主要方法)
接下来我需要做的是:我已经为 FoodItem 类初始化了一个名为“Oatmeal”的对象。
这个 FoodItem 有 4 个属性,如下所示:
import java.time.LocalDate;
public class FoodItem {
public String label;
private double volume;
private double weight;
private LocalDate expirationDate;
这些属性的值已在 Launcher 中设置如下:
FoodItem oatmeal = new FoodItem("Serving size is 1/2 Cup 40gr");
oatmeal.setVolume(25);
oatmeal.setWeight(0.500);
oatmeal.setExpirationDate(LocalDate.of(2025,2,5));
现在我需要做的是计算日期以检查产品的到期日期是否仍然有效,逻辑为(Expiration Date - Today's Date + 3 Days)为此,我创建了一个名为 stillValid 的方法,如下所示:
import java.time.Period;
import java.util.Arrays;
import java.time.LocalDate;
private boolean stillValid(FoodItem foodItem){
LocalDate date = LocalDate.now();
LocalDate dayLeft = date.plus(Period.ofDays(3));
if(foodItem.getExpirationDate() != dayLeft) {
return true;
}
return false;
}
现在我需要在我的 addItem 方法中使用这个方法来检查项目的到期日期是否未通过,我可以添加到商店。
public void addItem(FoodItem foodItem) {
int stop = 0;
for (int i = 0; i < foodItemsArray.length; i++) {
if (foodItemsArray[i] != null) {
stop = 1;
break;
}
}
if (stop == 0) {
for (int i = 0; i < foodItemsArray.length; i++) {
if (foodItemsArray[i] != foodItem) {
foodItemsArray[i] = foodItem;
break;
}
}
}
}
在这部分中,我无法在我的脑海中创建逻辑来在 addItem 主体中使用我的 stillValid 功能,或者即使我正确地执行了方法 stillValid 。
回答
tl;博士
仔细阅读LocalDateJavadoc 以发现方便的方法,例如isAfter和plusDays。
LocalDate.now().isAfter( this.getExpirationDate().plusDays( 3 ) ) ;
LocalDate.now().isAfter( this.getExpirationDate().plusDays( 3 ) ) ;
细节
将 a stillValidorexpired方法添加到您的FoodItem类中,如果这是了解将三天添加到到期日期的规则的合理位置。
为了比较LocalDate,使用isAfter和isBefore。
或者,更简单地说:
public boolean expired ()
{
LocalDate today = LocalDate.now() ; // Consider specifying a time zone here.
Period gracePeriod = Period.ofDays( 3 ) ;
LocalDate finalExpiration = this.getExpirationDate().plus( gracePeriod ) ;
boolean isExpired = today.isAfter( finalExpiration ) ;
return isExpired ;
}
用法:
if( ! foodItem.expired() ) { myList.add( foodItem ) ; }
if( ! foodItem.expired() ) { myList.add( foodItem ) ; }
警告:请注意,对于任何给定时刻,日期在全球各地因时区而异。现在是日本东京的“明天”,而加拿大多伦多仍是“昨天”。通过在ZoneId调用 时省略参数LocalDate.now,您的结果将因部署 JVM 的当前默认时区而异。正如评论中所建议的,考虑使用LocalDate#now( ZoneId zone )eg LocalDate.now( ZoneId.of( "America/New_York" ) )。
完整示例类
这是使用Java 16 中新增的记录功能的示例类。
public boolean expired ()
{
return LocalDate.now().isAfter( this.getExpirationDate().plusDays( 3 ) ) ;
}
用法。
跑的时候。
package work.basil.demo;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.util.Objects;
public record FoodItem(String label , double volume , double weight , LocalDate expirationDate , Period gracePeriod)
{
// Constructor.
public FoodItem ( final String label , final double volume , final double weight , final LocalDate expirationDate , final Period gracePeriod )
{
this.label = Objects.requireNonNull( label );
this.volume = Objects.requireNonNull( volume );
this.weight = Objects.requireNonNull( weight );
this.expirationDate = Objects.requireNonNull( expirationDate );
this.gracePeriod = Objects.requireNonNull( gracePeriod );
if ( this.gracePeriod.isNegative() ) { throw new IllegalArgumentException( "The grace period must be positive. Message # f511c804-db04-4783-8329-3a8e928b98cf." ); }
}
// Calculated value.
public boolean isExpired ( )
{
return LocalDate.now().isAfter( this.expirationDate().plus( this.gracePeriod ) );
}
}