避免使用 java.util.Date 和 .Calendar
accepted answer 在技术上是正确的,但不是最优的。 java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。使用Joda-Time 或新的java.time package(在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 类。请参阅correct Answer by Przemek 中的 java.time 解决方案。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 & JPA 2.2 支持 java.time。
从哪里获取 java.time 类?