如何检查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方法进行比较。
如果您使用LocalDateTime
, ZonedDateTime
或OffsetDateTime
等对象,则可以将其转换为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