如何检查date对象是否等于昨天?

现在我正在使用这个代码

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()返回的date是否是昨天的date。 只有date重要,而不是时间。 这就是我使用SimpleDateFormat的原因。 感谢您的帮助提前!

 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日的date。

我同意Ash Kim的观点,如果你想保持自己的理智, Joda-Time图书馆是最好的select。

 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

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方法进行比较。

如果您使用LocalDateTimeZonedDateTimeOffsetDateTime等对象,则可以将其转换为LocalDate

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

避免java.util.Date&.Calendar

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

时区

时区在date时间工作中至关重要。 如果您忽略该问题,则将应用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 ); 

testing目标是否在昨天的时间间隔内。

 boolean isYesterday = yesterdayInterval.contains( target ); 

很显然,这种半开放的方式不仅仅是“昨天”,比如“本周”,“上个月”等等。

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

而不是设置日历试试这个:

 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的值,或者你喜欢的任何东西。

我build议你考虑使用Joda-Time 。 它比JDK的产品更好。

当我用这种方法来testing这个方法时,我发现它有点混乱

  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()只处理月中的日子。

但实际的错误是我创build日历对象的方式。 在日历中,月份从0开始,variables现在的值是2001-2-1,我很自负,不打印它。当我发现错误的时候。 创build日历的正确方法是:

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

日历是一个前C#程序员很奇怪:(

大概是这样的:

  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