数组.java的日期计算方法

ykejflvf  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(311)

我有一个交付项目,包括以下类名:
食客
位置
路线
商店
车辆
仓库
启动器(包括主方法)
接下来需要做的是:我已经为fooditem类初始化了一个名为“oatmine”的对象。
此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));

现在我需要做的是计算日期,检查产品的过期日期是否仍然有效,逻辑为(过期日期-今天的日期+3天),为此我创建了一个名为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;
                }
            }
        }
    }

在这一部分中,我无法在头脑中创建逻辑,使我的stillvalid函数在additem body中,或者即使我正确地执行了stillvalid方法。

t40tm48m

t40tm48m1#

热释光;博士

细读 LocalDate javadoc可以发现方便的方法,例如 isAfter 以及 plusDays .

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

详细信息

添加 stillValid 或者 expired 你的方法 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 ;
}

或者,更简单地说:

public boolean expired ()
{
    return LocalDate.now().isAfter( this.getExpirationDate().plusDays( 3 ) ) ;
}

用法:

if( ! foodItem.expired() ) { myList.add( foodItem ) ; }

注意:请注意,对于任何给定的时刻,日期在全球各地因时区而异。现在是日本东京的“明天”,而加拿大多伦多的“昨天”。通过省略 ZoneId 调用时的参数 LocalDate.now ,您的结果将因部署jvm的当前默认时区而异。如评论中所建议的,考虑使用 LocalDate#now( ZoneId zone ) 例如 LocalDate.now( ZoneId.of( "America/New_York" ) ) .

完整示例类

下面是一个使用Java16中新的记录特性的示例类。

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

用法。

FoodItem oats = new FoodItem( "Oats" , 25d , 0.500d , LocalDate.of( 2025 , Month.FEBRUARY , 5 ) , Period.ofDays( 3 ) );
System.out.println( "oats = " + oats );
System.out.println( "Is oats expired: " + oats.isExpired() );

当你跑的时候。

oats = FoodItem[label=Oats, volume=25.0, weight=0.5, expirationDate=2025-02-05, gracePeriod=P3D]
Is oats expired: false

相关问题