Java (または java.util ライブラリ) に日付の差を計算する組み込み関数がないのはおかしいと思います。ある日付から別の日付を減算して、それらの間の経過時間を取得したいと考えています。これを行う最善の方法は何ですか?
簡単な方法は、時間の差をミリ秒単位で取り、それを日に変換することです。ただし、これがすべての場合(夏時間など)で機能するかどうかを知りたかったのです。
Java (または java.util ライブラリ) に日付の差を計算する組み込み関数がないのはおかしいと思います。ある日付から別の日付を減算して、それらの間の経過時間を取得したいと考えています。これを行う最善の方法は何ですか?
簡単な方法は、時間の差をミリ秒単位で取り、それを日に変換することです。ただし、これがすべての場合(夏時間など)で機能するかどうかを知りたかったのです。
オープンソースを見ると、Java はそれほど欠けているわけではありません。 Joda-Time を試してみてください。
簡単な方法は、時間の差をミリ秒単位で取り、それを日に変換することです。ただし、これがすべての場合(夏時間など)で機能するかどうかを知りたいと思いました。
時刻が UTC 日付から派生している場合、または同じシステムで測定された System.getCurrentTimeMillis() への 2 つの呼び出しの差である場合、タイムゾーンの問題に関係なく、差として有効なミリ秒数が得られます。(これが、すべてがUTCをストレージ形式として使用する必要がある理由です-UTC->ローカル時間から移動する方がはるかに簡単です;逆に行こうとすると、ローカル時間とともにローカルタイムゾーンを保存する必要があります-またはそれを推測しようとすると、ギャック!)
これを日数に変換する場合は、86400000 で割ることができるはずですが、1 年おきにうるう秒が発生することがあります。
Joda-Time または Java 8 の新しい java.time パッケージを使用します。
どちらのフレームワークも、開始が包括的で終了が排他的であるハーフ オープンアプローチを使用します。と表記されることもある。これは一般に、期間を定義するための最良の方法です。[)
Java 8 以降に組み込まれた java.time フレームワークにはPeriod
、期間を年数、月数、および日数として表すクラスがあります。ただし、このクラスは丸一日に限定されており、時間、分、秒の表現はありません。
日付を決定するために重要なタイムゾーンを指定していることに注意してください。たとえば、モントリオールよりもパリの方が早く新しい日の夜明けを迎えます。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate now = LocalDate.now( zoneId );
LocalDate then = LocalDate.of( 2001, 1, 1 );
Period period = Period.between( then, now );
その後: 2001 年 1 月 1 日。現在: 2015 年 9 月 7 日。期間: P14Y8M6D。日: 5362
丸一日の場合、夏時間 (DST)は関係ありません。
合計日数が必要な場合は、ChronoUnit
いくつかの計算方法を含む列挙型を使用します。計算が long を返すことに注意してください。
long days = ChronoUnit.DAYS.between( then, now ); // "5362" seen above.
java.time で時間、分、秒を含む完全な期間を実行することについて質問しました。Java 8 の時点では不可能です。Meno Hochschildによって、バンドルされたライブラリを使用した驚くべき回避策が提案されました。 javax.xml.datatype パッケージにあるクラスを使用します。Duration
Joda-Time 2.3 のコード例を次に示します。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime start = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );
DateTime stop = new DateTime( 2014, 5, 2, 3, 4, 5, timeZone );
Period period = new Period( start, stop );
を呼び出すと、 ISO 8601標準でtoString
定義されている形式で文字列表現が取得されます。PnYnMnDTnHnMnS
date4jライブラリの場合:
int numDaysBetween = oneDate.numDaysFrom(anotherDate);
それを実装する簡単な方法があります。ループで Calendar.add メソッドを使用できます。たとえば、以下のように、
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date beginDate = dateFormat.parse("2013-11-29");
Date endDate = dateFormat.parse("2013-12-4");
Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);
beginDate と endDate の間のマイナスの日数、および以下のコード、
int minusDays = 0;
while (true) {
minusDays++;
// Day increasing by 1
beginCalendar.add(Calendar.DAY_OF_MONTH, 1);
if (dateFormat.format(beginCalendar.getTime()).
equals(dateFormat.format(endCalendar).getTime())) {
break;
}
}
System.out.println("The substractation between two days is " + (minusDays + 1));
楽しんで!@.@
Java の日付の実装は貧弱です。Joda-Timeが複雑すぎる と感じた場合は、オープン ソースへの私の小さな貢献を試してみてください: http://calendardate.sourceforge.net/javadoc/index.html
Java には日付の差を計算するメカニズムがないという主張には同意しません。
Java は、グローバルな使用のために設計されました。日付の概念がないように設計されており、「ミリ秒単位の時間」の概念のみがあります。特定の慣習に基づく特定の場所の時刻と日付などの世界時の解釈は、単に投影またはビューにすぎません。
calendar クラスは、この種の絶対時間を日付に変換するために使用されます。本当に必要な場合は、日付コンポーネントを加算または減算することもできます。コンポーネントに関して 2 つの時間の違いを提供する唯一の方法は、Calendar を生成して特定することです。したがって、標準ライブラリには十分にスマートなグレゴリオ暦が含まれていないと主張することができます。
そうは言っても、この種の機能には多数の実装があり、他の人が例を提供していることがわかります。