クラスムービーがあり、開始日、期間、停止日があります。開始日と停止日は日付オブジェクトです(プライベート日付startDate ...)(これは割り当てなので変更できません)。今度は、期間(分単位)をstartDateに追加してstopDateを自動的に計算します。
私の知識では、Dateの関数を操作する時間は非推奨です。したがって、悪い習慣ですが、反対側では、Dateオブジェクトをカレンダーオブジェクトに変換して時間を操作し、Dateオブジェクトに再変換する方法はありません。方法はありますか?そして、ベストプラクティスとなるものがあれば
できることは、GregorianCalendar
のインスタンスを作成し、Date
を開始時間として設定することです。
Date date;
Calendar myCal = new GregorianCalendar();
myCal.setTime(date);
ただし、別のアプローチはDate
をまったく使用しないことです。次のようなアプローチを使用できます。
private Calendar startTime;
private long duration;
private long startNanos; //Nano-second precision, could be less precise
...
this.startTime = Calendar.getInstance();
this.duration = 0;
this.startNanos = System.nanoTime();
public void setEndTime() {
this.duration = System.nanoTime() - this.startNanos;
}
public Calendar getStartTime() {
return this.startTime;
}
public long getDuration() {
return this.duration;
}
このようにして、開始時間と開始から停止までの期間の両方にアクセスできます。もちろん、精度はあなた次第です。
Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);
dateはJava.util.Dateオブジェクトです。 Calendar.getInstance()を使用してCalendarインスタンスを取得することもできます(はるかに効率的です)。
名前だけでなく、APIメソッドのシグネチャと説明を見ると便利なことがよくあります:)-Java標準APIであっても、名前が誤解を招く場合があります。
このためにCalendar
に変換する必要はありません。代わりにgetTime()
/setTime()
を使用できます。
getTime()
:このDateオブジェクトによって表される1970年1月1日00:00:00 GMT以降のミリ秒数を返します。
setTime(long time)
:このDateオブジェクトを設定して、1970年1月1日00:00:00 GMT以降のミリ秒の時点を表します。 )
1秒に1000ミリ秒、1分に60秒があります。数学をするだけです。
Date now = new Date();
Date oneMinuteInFuture = new Date(now.getTime() + 1000L * 60);
System.out.println(now);
System.out.println(oneMinuteInFuture);
1000
のL
サフィックスは、long
リテラルであることを示します。これらの計算は通常、簡単にオーバーフローしますint
。
Instant stop =
myUtilDateStart.toInstant()
.plus( Duration.ofMinutes( x ) )
;
他の回答、特に Borgwardtによる回答 。ただし、これらの回答は旧式のレガシークラスを使用します。
Javaにバンドルされている元の日時クラスは、Java.timeクラスに取って代わりました。 Java.time型でビジネスロジックを実行します。 Java.time型を処理するためにまだ更新されていない古いコードを操作する必要がある場合にのみ、古い型に変換します。
Calendar
が実際に GregorianCalendar
である場合、ZonedDateTime
に変換できます。Java.time型との変換を容易にするために古いクラスに追加された新しいメソッドを見つけます。
if( myUtilCalendar instanceof GregorianCalendar ) {
GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class.
ZonedDateTime zdt = gregCal.toZonedDateTime(); // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar`
end if
Calendar
がGregorian
でない場合は、 toInstant
を呼び出してInstant
オブジェクトを取得します。 Instant
クラスは [〜#〜] utc [〜#〜] でタイムライン上の瞬間を表します解像度 ナノ秒 。
Instant instant = myCal.toInstant();
同様に、Java.util.Date
オブジェクトで開始する場合は、Instant
に変換します。 Instant
クラスは、 [〜#〜] utc [〜#〜] のタイムライン上の瞬間を表します。解像度は ナノ秒 (最大9桁の小数部分) )。
Instant instant = myUtilDate.toInstant();
タイムゾーンを適用して、 ZonedDateTime
を取得します。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
Java.util.Date
オブジェクトを取得するには、Instant
を調べます。
Java.util.Date utilDate = Java.util.Date.from( zdt.toInstant() );
レガシーの日付時刻型とJava.timeの間の変換の詳細については、 my Answer to another Questionを参照してください。
Duration
期間を Duration
オブジェクトとして表します。期間の入力は、質問で述べた分数です。
Duration d = Duration.ofMinutes( yourMinutesGoHere );
これを開始に追加して、停止を決定できます。
Instant stop = startInstant.plus( d );
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacyJava.util.Date
などの日時クラスに取って代わります。 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクト、現在 メンテナンスモード )は、Java.timeへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。多くの例と説明についてはStack Overflowを検索してください。仕様は JSR 310 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
、および more 。
何かのようなもの
movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
日付をさまざまなタイプに変換する方法の完全な例を次に示します。
Date date = Calendar.getInstance().getTime();
// Display a date in day, month, year format
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String today = formatter.format(date);
System.out.println("Today : " + today);
// Display date with day name in a short format
formatter = new SimpleDateFormat("EEE, dd/MM/yyyy");
today = formatter.format(date);
System.out.println("Today : " + today);
// Display date with a short day and month name
formatter = new SimpleDateFormat("EEE, dd MMM yyyy");
today = formatter.format(date);
System.out.println("Today : " + today);
// Formatting date with full day and month name and show time up to
// milliseconds with AM/PM
formatter = new SimpleDateFormat("EEEE, dd MMMM yyyy, hh:mm:ss.SSS a");
today = formatter.format(date);
System.out.println("Today : " + today);