gpt4 book ai didi

java - Java的日期计算方法

转载 作者:行者123 更新时间:2023-12-02 02:15:49 25 4
gpt4 key购买 nike

我有一个交付项目,其中包含以下类名:

食品项目
地点
路线
商店
车辆
仓库
Launcher(包括main方法)

接下来我需要做的是:我已经为 FoodItem 类初始化了一个名为“Oatmeal”的对象。

此 FoodItem 有 4 个属性,如下所示:

import java.time.LocalDate;

public class FoodItem {
public String label;
private double volume;
private double weight;
private LocalDate expirationDate;

这些属性的值已在启动器中设置如下:

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

在这一部分中,我无法在脑海中创建逻辑以在 addItem 主体中使用 stillValid 函数,或者即使我正确执行了 stillValid 方法。

最佳答案

tl;博士

仔细阅读LocalDate Javadoc 来发现方便的方法,例如 isAfterplusDays

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

详细信息

向您的 FoodItem 类添加一个 stillValidexpired 方法(如果这是了解添加三天规则的合理位置)到期日期。

要比较 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 ;
}

或者,更简单地说:

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

用法:

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

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

完整示例类

这是一个使用 records 的示例类功能new in Java 16 .

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

关于java - Java的日期计算方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67198992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com