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 以发现方便的方法,例如isAfterplusDays

LocalDate.now().isAfter( this.getExpirationDate().plusDays( 3 ) ) ;
LocalDate.now().isAfter( this.getExpirationDate().plusDays( 3 ) ) ;

细节

将 a stillValidorexpired方法添加到您的FoodItem类中,如果这是了解将三天添加到到期日期的规则的合理位置。

为了比较LocalDate,使用isAfterisBefore

或者,更简单地说:

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


以上是Java的日期计算方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>