web-dev-qa-db-ja.com

カレンダーへの日付オブジェクト[Java]

クラスムービーがあり、開始日、期間、停止日があります。開始日と停止日は日付オブジェクトです(プライベート日付startDate ...)(これは割り当てなので変更できません)。今度は、期間(分単位)をstartDateに追加してstopDateを自動的に計算します。

私の知識では、Dateの関数を操作する時間は非推奨です。したがって、悪い習慣ですが、反対側では、Dateオブジェクトをカレンダーオブジェクトに変換して時間を操作し、Dateオブジェクトに再変換する方法はありません。方法はありますか?そして、ベストプラクティスとなるものがあれば

66
Samuel

できることは、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;
}

このようにして、開始時間と開始から停止までの期間の両方にアクセスできます。もちろん、精度はあなた次第です。

96
Lars Andren
Calendar tCalendar = Calendar.getInstance();
tCalendar.setTime(date);

dateはJava.util.Dateオブジェクトです。 Calendar.getInstance()を使用してCalendarインスタンスを取得することもできます(はるかに効率的です)。

27
Bozhidar Batsov

Calendar.setTime()

名前だけでなく、APIメソッドのシグネチャと説明を見ると便利なことがよくあります:)-Java標準APIであっても、名前が誤解を招く場合があります。

6

このために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);

1000Lサフィックスは、longリテラルであることを示します。これらの計算は通常、簡単にオーバーフローしますint

6

tl; dr

Instant stop = 
    myUtilDateStart.toInstant()
                   .plus( Duration.ofMinutes( x ) ) 
;

Java.time

他の回答、特に 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 

CalendarGregorianでない場合は、 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.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacyJava.util.Date などの日時クラスに取って代わります。 Calendar 、& SimpleDateFormat

Joda-Time プロジェクト、現在 メンテナンスモード )は、Java.timeへの移行を推奨しています。

詳細については、 Oracleチュートリアル を参照してください。多くの例と説明についてはStack Overflowを検索してください。仕様は JSR 310 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • 実装がバンドルされた標準Java AP​​Iの一部。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および SE 7
    • Java.time機能の多くは、 ThreeTen-Backport のJava 6および7にバックポートされています。
  • Android
    • ThreeTenABP プロジェクトは、AndroidのThreeTen-Backport(上記)に適応します。 。
    • 使用方法… を参照してください。

ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter 、および more

2
Basil Bourque

何かのようなもの

movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);
0
Xorty

日付をさまざまなタイプに変換する方法の完全な例を次に示します。

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);
0
Vitor Reais