java.util.Dateと.Calendarは避けてください
受け入れられた答えは正しいです。ただし、java.util.Dateクラスと.Calendarクラスは厄介なことで有名です。それらを避けてください。Joda -Timeまたは新しいjava.timeパッケージ(Java 8の場合)のいずれかを使用します。
日時操作とフォーマットを分離する
また、質問のコードは、日時の作業とフォーマットを組み合わせています。これらのタスクを分離して、コードを明確にし、テスト/デバッグを容易にします。
タイムゾーン
タイムゾーンは、日時作業で重要です。この問題を無視すると、JVMのデフォルトのタイムゾーンが適用されます。デフォルトに依存するのではなく、常に指定することをお勧めします。デフォルトが必要な場合でも、明示的にを呼び出しますgetDefault
。
1日の始まりは、タイムゾーンによって定義されます。モントリオールよりもパリの方が早く新しい日が始まります。したがって、「昨日」がその日の最初の瞬間を意味する場合は、(a)タイムゾーンを指定し、(b)を呼び出す必要がありますwithTimeAtStartOfDay
。
ジョーダタイム
Joda-Time2.3のサンプルコード。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime today = DateTime.now( timeZone );
または、java.util.Dateオブジェクトから変換します。
DateTime today = new DateTime( myJUDate, timeZone );
昨日(または前日)に到達するために1日を減算します。
DateTime yesterday = today.minusDays( 1 );
DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
デフォルトでは、Joda-Timeおよびjava.timeは、ISO8601形式の文字列を解析/生成します。
String output = yesterdayStartOfDay.toString(); // Uses ISO 8601 format by default.
完全な日付には、4桁の年、2桁の月、および2桁の日(yyyy-MM-dd)としてフォーマッターを使用します。このようなフォーマッタは、Joda-Timeですでに定義されています。
String outputDatePortion = ISODateFormat.date().print( yesterdayStartOfDay );