避免使用java.util.Date和.Calendar
接受的答案在技术上是正确的,但不够优化。java.util.Date和.Calendar类非常麻烦。避免使用它们,可以使用Joda-Time或新的java.time包(在Java 8中)。
时区
时区在日期时间处理中非常重要。如果忽略这个问题,JVM的默认时区将被应用。更好的做法是始终指定时区而不是依赖默认值。即使您想要默认值,也要明确调用getDefault
。
一天的开始由时区定义。在柏林比蒙特利尔早,所以“今天”和“昨天”的定义需要一个时区。
Joda-Time
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解决方案。
关于java.time
java.time框架内置于Java 8及更高版本中。这些类代替了麻烦的旧版遗留日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
想了解更多,请参阅Oracle教程。在Stack Overflow上搜索许多示例和解释。规范是JSR 310。
Joda-Time项目现在处于维护模式,建议迁移到java.time类。
你可以直接使用
java.time 对象与数据库进行交互。使用符合
JDBC 4.2 或更高版本的
JDBC 驱动程序。不需要字符串,也不需要
java.sql.*
类。Hibernate 5 和 JPA 2.2 支持
java.time。
在哪里获取
java.time 类?
java.time
,应该优先使用它而不是joda-time、java.util.Date
和java.util.Calendar
:https://dev59.com/GnA75IYBdhLWcg3w9-Sx#33893147。 - liltitus27