Javaで日付にn時間を追加しますか?


136

Dateオブジェクトにn時間を追加するにはどうすればよいですか?StackOverflowで日を使用する別の例を見つけましたが、それでも時間でそれを行う方法がわかりません。


3
可能な場合は、joda-time.sourceforge.netを使用してください。
Babar

3
可能であれば、Java 8の日付と時刻を使用します
peceps

@Babar FYI、Joda -Timeプロジェクトがメンテナンスモードになり、チームはjava.timeクラスへの移行をアドバイスします。Oracleによるチュートリアルを参照してください。
バジルブルク2018年

回答:


210

Calendarクラスを確認してください。それは持っているadd時間の操作を可能にする方法(およびいくつかの他を)。このようなものが動作するはずです。

    Calendar cal = Calendar.getInstance(); // creates calendar
    cal.setTime(new Date()); // sets calendar time/date
    cal.add(Calendar.HOUR_OF_DAY, 1); // adds one hour
    cal.getTime(); // returns new date object, one hour in the future

詳細については、APIを確認してください。


4
夏時間/夏時間を扱っている場合は注意してください。
CurtainDog 2010

5
言うまでもなく、「負の時間」を追加できます
pramodc84

6
@CurtainDog Using Calendar.add()はそれを自動的に処理します。
Jesper、2010

6
cal.setTime(new Date())は必要ありません-Calendar.getInstance()のjavadocは次のように述べています。
ミトランジル2014

FYI、といった面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8&9のJavaを参照してくださいに組み込まれたクラスのチュートリアル Oracleで
バジルブルク2018年

82

Apache Commons / Langを使用している場合は、次のコマンドを使用して1つの手順で実行できますDateUtils.addHours()

Date newDate = DateUtils.addHours(oldDate, 3);

(元のオブジェクトは変更されていません)


3
またnegativ時間を使うことができますDateUtils.addHours(oldDate, -1);
Kaptain

裏では、これはニキータの答えとまったく同じですが、非常にシンプルで読みやすいです。さらに、Apache Commons / Langをすでに使用している場合...なぜでしょうか?
マット

28

@Christopherの例を単純化するため。

あなたが一定しているとしましょう

public static final long HOUR = 3600*1000; // in milli-seconds.

あなたは書ける。

Date newDate = new Date(oldDate.getTime() + 2 * HOUR);

Dateオブジェクトの代わりにlongを使用して日付/時刻を格納すると、次のことができます

long newDate = oldDate + 2 * HOUR;

26

tl; dr

myJavaUtilDate.toInstant()
              .plusHours( 8 )

または…

myJavaUtilDate.toInstant()                // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
              .plus(                      // Do the math, adding a span of time to our moment, our `Instant`. 
                  Duration.ofHours( 8 )   // Specify a span of time unattached to the timeline.
               )                          // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.

java.timeの使用

Java 8以降に組み込まれたjava.timeフレームワークは、古いJava.util.Date/.Calendarクラスに取って代わります。それらの古いクラスは悪名高いほど厄介です。それらを避けてください。

toInstantjava.util.Dateに新しく追加されたメソッドを使用して、古い型から新しいjava.time型に変換します。アンはInstantでタイムライン上の瞬間であるUTCの解像度を持つナノ秒

Instant instant = myUtilDate.toInstant();

などをInstant渡すことで、それに時間を追加できます。TemporalAmountDuration

Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );

その日時を読み取るには、を呼び出して、標準ISO 8601形式の文字列を生成しますtoString

String output = instantHourLater.toString();

ある地域の実時間のレンズを通してその瞬間を見たいと思うかもしれません。をInstant作成して、を希望のタイムゾーンに調整しますZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

または、電話plusHoursをかけて時間数を追加することもできます。ゾーニングされていると、夏時間(DST)とその他の異常がユーザーに代わって処理されます。

ZonedDateTime later = zdt.plusHours( 8 );

java.util.Dateおよびを含む古い日時クラスの使用は避けてください.Calendar。ただしjava.util.Date、java.timeタイプ用にまだ更新されていないクラスとの相互運用性が本当に必要な場合は、ZonedDateTimevia から変換してくださいInstant。古いクラスに追加された新しいメソッドは、java.time型との間の変換を容易にします。

java.util.Date date = java.util.Date.from( later.toInstant() );

変換の詳細について、質問への回答java.util.Dateを「java.time」タイプに変換するを参照しください


java.timeについて

java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスjava.util.DateCalendar&を、SimpleDateFormat

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。

java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*

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

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

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを


23

ジョダタイム

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);

2
これには少し不必要ですが、日付の操作をさらに行う場合は、joda時間は素晴らしいライブラリです
Joeri Hendrickx

3
@JoeriHendrickxプログラマは、その後、現在までに時間を追加されている場合は非常に可能性が、彼らは他の日時の仕事をしています。Joda-Timeは不要だとはまったく思いません。新しいプロジェクトをセットアップするときに最初にすることは、Joda-Timeを追加することです。でも、SunとOracleは、彼らが新たに追加して、古いjava.util.Date&カレンダー必要性が、段階的に廃止されることに同意したjava.timeを*パッケージ。ジャワ〜8(ジョダタイムに触発)
バジルボーク

AndroidでJodaに問題が発生しました。取得し続けたClassNotDefinedException
TheRealChx101

23

Java 8以降:

LocalDateTime.now().minusHours(1);

LocalDateTimeAPIを参照してください。


4
近いですが、正確ではありません。あなたはではZonedDateTimeなく、のために行くべきLocalDateTimeです。「ローカル」と、特定の場所に関連付けられておらず、タイムラインに関連付けられていないことを意味します。「2015年12月25日の真夜中にクリスマスが始まる」のように、さまざまなタイムゾーンで異なる瞬間があります。特定のタイムゾーンを適用してタイムライン上の特定の瞬間を取得するまでは意味がありません。さらに、タイムゾーンがない場合、夏時間(DST)およびその他の異常は、LocalDateTimeのこのような使用で処理されません。比較して私の答えをください。
バジルブルク

1
また、取得するjava.util.Date要求者たちを求めていたように、オブジェクトをZonedDateTime.toInstant()してDate.from()、ここで説明したようstackoverflow.com/a/32274725/5661065
hayduke

16

新しいjava.util.concurrent.TimeUnitクラスを使用すると、次のようにすることができます

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours

14

何かのようなもの:

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours

1
FYI、といった面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8&9のJavaを参照してくださいに組み込まれたクラスのチュートリアル Oracleで
バジルブルク2018年

7

これは、Dateオブジェクトが日時形式の場合の別のコードです。このコードの優れた点は、時間数を増やすと、それに応じて日付も更新されることです。

    String myString =  "09:00 12/12/2014";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
    Date myDateTime = null;

    //Parse your string to SimpleDateFormat
    try
      {
        myDateTime = simpleDateFormat.parse(myString);
      }
    catch (ParseException e)
      {
         e.printStackTrace();
      }
    System.out.println("This is the Actual Date:"+myDateTime);
    Calendar cal = new GregorianCalendar();
    cal.setTime(myDateTime);

    //Adding 21 Hours to your Date
    cal.add(Calendar.HOUR_OF_DAY, 21);
    System.out.println("This is Hours Added Date:"+cal.getTime());

これが出力です:

    This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
    This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014

1
次も使用できます。Calendar cal = Calendar.getInstance();
Stefan Sprenger、2015

4
Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);

4

を使用する場合はjava.time、ISO 8601形式の期間を追加する方法を次に示します。

import java.time.Duration;
import java.time.LocalDateTime;

...

LocalDateTime yourDate = ...

...

// Adds 1 hour to your date.

yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.  

1
Duration.parse(iso8601duration)興味深いですが、感謝しますが、で演算子+を使用することはできませんLocalDateTime。編集したいかもしれません。しかし、.plus(...)機能します。
qlown

@qlownに感謝します。+はgroovyで機能していると思います。それに応じて答えを変更します。
ダニエル

質問はDate、UTCの特定の瞬間を表すオブジェクトに関するものです。の使用はLocalDateTime質問に対処できません。LocalDateTimeタイムゾーンやUTCからのオフセットの概念がないため、瞬間を表すことができません。この問題の間違ったクラス。参照してください。インスタントとのLocalDateTimeの違いは何ですか?
バジル

@BasilBourque Dateオブジェクトは非推奨です。タイムゾーンに関しては質問が曖昧なので、私の答えはそのままです。さらに、あなただけ入れ替えることができますLocalDateTimeのためにZonedDateTime
ダニエル

4

あなたはJoda DateTime APIでそれを行うことができます

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();

1行目をDateTimeに変更した後の作業dateTime = new DateTime(dateObj);
Sundararaj Govindasamy 2017年

1

Java 8クラスを使用する。以下のように非常に簡単に日付と時刻を操作できます。

LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);

質問はDate、UTCの特定の瞬間を表すオブジェクトに関するものです。の使用はLocalDateTime質問に対処できません。LocalDateTime時間帯やオフセットからのオフセットの概念が欠けているため、瞬間を表すことはできません。この問題の間違ったクラス。参照してください。インスタントとのLocalDateTimeの違いは何ですか?
バジルブルク

0

Java 8のLocalDateTimeクラスを使用できます。例:

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));

質問はDate、UTCの特定の瞬間を表すオブジェクトに関するものです。の使用はLocalDateTime質問に対処できません。LocalDateTime時間帯やオフセットからのオフセットの概念が欠けているため、瞬間を表すことはできません。この問題の間違ったクラス。参照してください。インスタントとのLocalDateTimeの違いは何ですか?
バジルブルク

-1

この方法を使用できます。理解と実装が簡単です。

public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, nombreHeure);
    calendar.add(Calendar.MINUTE, nombreMinute);
    calendar.add(Calendar.SECOND, nombreSeconde);
    return calendar.getTime();
}

このアプローチは、数年前に投稿された別の回答ですでに提示されています。これがどのように価値を追加するかはわかりません。
バジルブルク2017年

私の提案の付加価値は、シンプルさと実装の容易さです。ユーザーはそれを貼り付けて使用し、時間、分、秒を追加するだけです。ご存知のように、初心者のレベルは異なり、提案された回答が単純な回答を組み合わせる場合そして、それが認められるであろう高度な答え:)
Nimpo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.