避免java.util.Date &。日历
该accepted answer是正确的。但是,java.util.Date和.Calendar类出了名的麻烦。避免它们。使用Joda-Time或新的java.time package(在Java 8中)。
独立日期时间操纵从格式化
同样,在问题的代码融合了格式化日期时间的工作。将这些任务分开以使代码更清晰,并且更容易进行测试/调试。
时区
时区对日期时间工作至关重要。如果您忽略该问题,则将应用JVM的默认时区。更好的做法是始终指定而不是依靠默认值。即使你想要默认值,明确地调用getDefault
。
一天的开始由时区定义。早些时候在巴黎的一个新的一天比蒙特利尔早。因此,如果“昨天”是指当天的第一时刻,那么您应该(a)指定时区,并(b)致电withTimeAtStartOfDay
。
Joda-Time
Joda-Time中的示例代码2.3。
DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris");
DateTime today = DateTime.now(timeZone);
或者从java.util.Date对象转换而来。
DateTime today = new DateTime(myJUDate, timeZone);
减去一天到昨天(或前一天)。在ISO 8601格式
DateTime yesterday = today.minusDays(1);
DateTime yesterdayStartOfDay = today.minusDays(1).withTimeAtStartOfDay();
默认情况下,乔达,时间和java.time解析/生成的字符串。
String output = yesterdayStartOfDay.toString(); // Uses ISO 8601 format by default.
使用格式化为一个完整的日期为四位数年份,年份的两位数月份和月(YYYY-MM-DD)的两位数的一天。 Joda-Time已经定义了这种格式化器。
String outputDatePortion = ISODateFormat.date().print(yesterdayStartOfDay);
以下的工作,如果你避免了一个小任务额外的库完全 – 2013-02-18 14:12:10