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

tzi*_*ppy 44 java calendar date java-time

现在我正在使用此代码

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
Run Code Online (Sandbox Code Playgroud)

必须有一种更平滑的方法来检查getdateFromLine()返回的日期是否是昨天的日期.只有日期很重要,而不是时间.这就是我使用SimpleDateFormat的原因.感谢您的帮助!

And*_*anu 76

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)) {
Run Code Online (Sandbox Code Playgroud)

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

  • 它的工作原理是因为Calendar.add将日期的时间戳更改为根据字段类型和输入的金额计算的偏移量.因此,无论原始日期如何,它仅使用时间戳(自1970年1月1日以来的毫秒数),并根据加/减计算输入的差值计算新日期.即使字段为DAY_OF_YEAR,这实际上也会改变年份. (5认同)
  • 为什么这个工作在1月1日?12月31日的年份不一样吗? (3认同)
  • 任何看到这个帖子的人都应该参考@Przemek的答案,它使用“java.time”,它应该优先于joda-time、“java.util.Date”和“java.util.Calendar”:http:// /stackoverflow.com/a/33893147/1322243 (2认同)

Prz*_*mek 17

java.time

使用java.timeJava 8内置的框架

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

yesterday.equals(now); //false
yesterday.equals(yesterday); //true
Run Code Online (Sandbox Code Playgroud)

官方Oracle LocalDate 教程指出

equals方法应该用于比较.

如果你正在使用的对象,如工作LocalDateTime,ZonedDateTime或者OffsetDateTime,你可以转换为LocalDate.

LocalDateTime.now().toLocalDate(); # 2015-11-24
Run Code Online (Sandbox Code Playgroud)


plo*_*man 14

我同意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);
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,如果DateTime day是从昨天开始,那么dayIsYesterday(day)将返回true.


Bas*_*que 8

避免使用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 ); 
Run Code Online (Sandbox Code Playgroud)

确定昨天的一种方法是转换为LocalDate对象.这里显示的另一种方式是将"昨天"表示为一段时间.我们将这个跨度定义为从昨天的第一个时刻开始,但不包括今天的第一个时刻.这种方法被称为"半开放",其中开头是包容性的,结尾是排他性的.

减去一天到达昨天(或前一天).

DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval( yesterdayStartOfDay, today.withTimeAtStartOfDay() );
Run Code Online (Sandbox Code Playgroud)

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

DateTime target = new DateTime( myJUDate, timeZone );
Run Code Online (Sandbox Code Playgroud)

测试目标是否在昨天的间隔内着陆.

boolean isYesterday = yesterdayInterval.contains( target );
Run Code Online (Sandbox Code Playgroud)

显然,这种半开放时间的方法不仅仅是"昨天",例如"本周","上个月"等等.

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