避免使用 java.util.Date & .Calendar
接受的答案是正确的。然而,java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。使用Joda-Time或新的java.time 包(在 Java 8 中)。
将日期时间操作与格式化分开
此外,问题中的代码将日期时间工作与格式混合在一起。将这些任务分开,使您的代码更清晰,测试/调试更容易。
时区
时区在日期时间工作中至关重要。如果您忽略此问题,将应用 JVM 的默认时区。更好的做法是始终指定而不是依赖默认值。即使您想要默认值,也要显式调用getDefault
.
一天的开始由时区定义。巴黎的新一天比蒙特利尔更早。因此,如果“昨天”是指当天的第一刻,那么您应该 (a) 指定时区,并且 (b) 调用withTimeAtStartOfDay
.
乔达时间
Joda-Time 2.3 中的示例代码。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime today = DateTime.now( timeZone );
或者从 java.util.Date 对象转换。
DateTime today = new DateTime( myJUDate, timeZone );
减去一天以得到昨天(或前一天)。
DateTime yesterday = today.minusDays( 1 );
DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
默认情况下,Joda-Time 和 java.time 解析/生成ISO 8601格式的字符串。
String output = yesterdayStartOfDay.toString(); // Uses ISO 8601 format by default.
使用格式化程序将完整日期设置为四位数年份、两位数月份和两位数月份日期 (yyyy-MM-dd)。Joda-Time 中已经定义了这样的格式化程序。
String outputDatePortion = ISODateFormat.date().print( yesterdayStartOfDay );