java-如何检查日期对象是否等于昨天?

现在我正在使用此代码

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE) - 1, 12, 0, 0); //Sets Calendar to "yeserday, 12am"
if(sdf.format(getDateFromLine(line)).equals(sdf.format(cal.getTime()))) //getDateFromLine() returns a Date Object that is always at 12pm
{...CODE

必须有一种更平滑的方法来检查getdateFromLine()返回的日期是否为昨天的日期。 仅日期重要,时间不重要。 这就是为什么我使用SimpleDateFormat。谢谢您的帮助!

8个解决方案

76 votes

Calendar c1 = Calendar.getInstance(); // today

c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday

Calendar c2 = Calendar.getInstance();

c2.setTime(getDateFromLine(line)); // your date

if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)

&& c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) {

这也适用于1月1日这样的日期。

Andrei Fierbinteanu answered 2020-07-18T09:07:30Z

17 votes

java.time

使用Java 8中内置的java.time框架

LocalDate now = LocalDate.now(); //2015-11-24

LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23

yesterday.equals(now); //false

yesterday.equals(yesterday); //true

官方Oracle LocalDate教程状态

equals方法应用于比较。

如果您正在使用LocalDate、LocalDate或LocalDate之类的对象,则可以转换为LocalDate。

LocalDateTime.now().toLocalDate(); # 2015-11-24

Przemek answered 2020-07-18T09:08:08Z

14 votes

我同意Ash Kim的观点,如果您想保持理智,可以使用Joda-Time库。

import org.joda.time.DateTime;
public static boolean dayIsYesterday(DateTime day) {
DateTime yesterday = new DateTime().withTimeAtStartOfDay().minusDays(1);
DateTime inputDay = day.withTimeAtStartOfDay();
return inputDay.isEqual(yesterday);
}

在此示例中,如果DateTime day来自昨天,则dayIsYesterday(day)将返回true。

plowman answered 2020-07-18T09:08:32Z

8 votes

避免使用java.util.Date和.Calendar

可接受的答案在技术上是正确的,但并非最佳。 众所周知,java.util.Date和.Calendar类很麻烦。 避免他们。 使用Joda-Time或新的java.time包(在Java 8中)。

时区

时区在日期时间工作中至关重要。 如果您忽略此问题,则将应用JVM的默认时区。 更好的做法是始终指定而不是依赖默认值。 即使您想要默认值,也要显式调用getDefault。

一天的开始由时区定义。 柏林比蒙特利尔早到了新的一天。 因此,“今天”和“昨天”的定义需要一个时区。

乔达时代

Joda-Time 2.3中的示例代码。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" );

DateTime today = DateTime.now( timeZone );

确定昨天的一种方法是转换为LocalDate对象。 此处显示的另一种方法是将“昨天”表示为时间跨度。 我们将跨度定义为从昨天的第一刻到今天的第一刻,但不包括今天的第一刻。 这种方法称为“半开放式”,其中开始是包含在内的,结尾是排斥的。

减去一天直到昨天(或前一天)。

DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();

Interval yesterdayInterval = new Interval( yesterdayStartOfDay, today.withTimeAtStartOfDay() );

将目标java.util.Date对象转换为Joda-Time DateTime对象。 将时区应用于该新对象,而不是依赖于应用JVM的默认时区。 从技术上讲,此处的时区是无关紧要的,但包括时区是一个好习惯。

DateTime target = new DateTime( myJUDate, timeZone );

测试目标是否在昨天的间隔内降落。

boolean isYesterday = yesterdayInterval.contains( target );

显然,这种具有半开放时间跨度的方法不仅仅适用于“昨天”,例如“本周”,“上个月”等等。

更新:Joda-Time项目现在处于维护模式。 该团队建议迁移到java.time类。 请参见Przemek的正确答案中的java.time解决方案。

Basil Bourque answered 2020-07-18T09:09:46Z
2 votes

代替设置日历,请尝试以下操作:

public static void main(String[] args) {
int DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
String prevDate = dateFormat.format(date.getTime() - DAY_IN_MILLIS);
String currDate = dateFormat.format(date.getTime());
String nextDate = dateFormat.format(date.getTime() + DAY_IN_MILLIS);
System.out.println("Previous date: " + prevDate);
System.out.println("Current date: " + currDate);
System.out.println("Next date: " + nextDate);
}

这应该使您可以沿日历前后移动

然后,您可以简单地将getDateFromLine(line)与prevDate值或任何您喜欢的值进行比较。

gruntled answered 2020-07-18T09:10:15Z

1 votes

我建议您考虑使用Joda-Time。 它比JDK产品更好。

chickeninabiscuit answered 2020-07-18T09:10:35Z

0 votes

使用这种方法测试此方法时,我感到有些困惑

Calendar now = new GregorianCalendar(2000, 1, 1);

now.add(Calendar.DATE, -1);

SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");

System.out.println(format.format(now.getTime()));

我的期望是打印1999-12-31,但实际是2001-1-31我猜Calendar.add()只处理一个月中的某天。

但是实际的错误是我创建Calendar对象的方式。在Calendar中,月份从0开始,变量的值现在是2001-2-1,我很自以为是不打印它。当我发现有问题时。创建日历的正确方法是:

Calendar now = new GregorianCalendar(2000, Calendar.JANUARY, 1);

日历对于前C#程序员来说太奇怪了:(

Allen answered 2020-07-18T09:11:08Z
0 votes

大概是这样的:

Calendar c1 = Calendar.getInstance();
Date d1 = new Date(/* control time */);
c1.setTime(d1);
//current date
Calendar c2 = Calendar.getInstance();
int day1=c1.get(Calendar.DAY_OF_YEAR);
int day2=c2.get(Calendar.DAY_OF_YEAR);
//day2==day1+1
Inv3r53 answered 2020-07-18T09:11:28Z