vermeiden java.util.Date & .Kalender
Die accepted answer ist korrekt. Die Klassen java.util.Date und .Calendar sind jedoch bekanntermaßen mühsam. Vermeide sie. Verwenden Sie entweder Joda-Time oder die neue java.time package (in Java 8).
Separate Date-Time Manipulation von der Formatierung
Auch mischt der Code in der Frage Datum Zeitarbeit mit der Formatierung. Trennen Sie diese Aufgaben, um Ihren Code zu vereinfachen und das Testen/Debuggen zu vereinfachen.
Zeitzone
Zeitzone ist in Datum Zeitarbeit kritisch. Wenn Sie das Problem ignorieren, wird die Standardzeitzone der JVM angewendet. Eine bessere Vorgehensweise besteht darin, immer anzugeben, anstatt sich auf den Standardwert zu verlassen. Auch wenn Sie den Standard wünschen, rufen Sie explizit getDefault
.
Der Beginn des Tages wird durch die Zeitzone definiert. Ein neuer Tag dämmert früher in Paris als in Montréal. Wenn Sie also mit "gestern" den ersten Moment dieses Tages meinen, dann sollten Sie (a) eine Zeitzone angeben und (b) withTimeAtStartOfDay
anrufen.
Joda-Time
Beispielcode in Joda-Time 2.3.
DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris");
DateTime today = DateTime.now(timeZone);
Oder konvertieren von einem java.util.Date-Objekt.
DateTime today = new DateTime(myJUDate, timeZone);
Subtrahieren Sie einen Tag, um zu gestern (oder Tag vorher) zu gelangen.
DateTime yesterday = today.minusDays(1);
DateTime yesterdayStartOfDay = today.minusDays(1).withTimeAtStartOfDay();
standardmäßig Joda-Time und java.time Parse/erzeugen Strings in ISO 8601 Format.
String output = yesterdayStartOfDay.toString(); // Uses ISO 8601 format by default.
einen Formatierer für einen ganzen Tag in einem vierstelliges Jahr zweistelliger Monat des Jahres verwenden, und zweistelligen Tag des Monats (yyyy-MM-dd). Ein solcher Formatierer ist bereits in Joda-Time definiert.
String outputDatePortion = ISODateFormat.date().print(yesterdayStartOfDay);
Der deprecation Text deutet auf 'Calendar', wenn Sie es vollständig –