JavaでDateオブジェクトからX日を引く方法は?


147

私は次のようなことをしたいです:

Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"

どうやってするの?


4
必須の「Use Joda Time」発言。
スティーブマクロード

1
次のリンクが役立つ場合があります。[ここにリンクの説明を入力] [1] [ここにリンクの説明を入力] [2] [1]:stackoverflow.com/questions/212321/… [2]:stackoverflow.com/questions/ 2623610 /…
Ami

参考までに、java.timeクラスに取って代わる、java.util.Date今ではレガシーなどの厄介な古い日時クラス。
バジルブルク2017年

回答:


280

Java 8以降

Java 8の日時APIの変更に伴い、 LocalDate

LocalDate date = LocalDate.now().minusDays(300);

同様にあなたが持つことができます

LocalDate date = someLocalDateInstance.minusDays(300);

java.util.Date <-> java.time.LocalDateTime間の変換については、https: //stackoverflow.com/a/23885950/260990を参照してください

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

Java 7およびそれ以前

Calendaradd()方法を使用

Calendar cal = Calendar.getInstance();
cal.setTime(dateInstance);
cal.add(Calendar.DATE, -30);
Date dateBefore30Days = cal.getTime();

22
現在の日付時刻を考慮したくない場合に備えて、カスタムのdateInstanceを設定します
Jigar Joshi

11
Javaの日付の扱いがあるので、肥大化!
-digory doo 2017

1
これは4年前の答えです。最近のバージョンでは、DateTime APIに新しい変更が加えられています。答えを編集します
Jigar Joshi

FYI、といった面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleTextFormat今のレガシーに取って代わられ、java.timeのクラス。Oracleによるチュートリアルを参照してください。
バジルブルク2017

@JigarJoshi Java 8 APIを使用して回答を更新するのはすばらしいことです。あなたの答えは、人々が最初に見る受け入れられたものです。
jotaen

47

@JigarJoshiは良い答えです。もちろん、@ Timの使用も推奨されます。ジョーダタイム

から日を引く可能性をさらに追加したいだけですjava.util.Date

Apache-コモンズ

1つの可能性は、apache-commons-langを使用することです。DateUtils次のようにしてそれを行うことができます:

Date dateBefore30Days = DateUtils.addDays(new Date(),-30);

もちろん、commons-lang日付の減算のみを行うように依存関係を追加することは、おそらく良いオプションではありませんが、既に使用しcommons-langている場合は、それを選択することをお勧めします。便利な方法もありaddYearsaddMonthsaddWeeksというように、見て取り、ここAPIが

Java 8

別の可能性は、メソッドを使用LocalDateしてJava 8の新機能を利用minusDays(long days)することです。

LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);

LocalDateTimeそのクラスを意図的に使用する意味は、タイムゾーンの概念もオフセットからのオフセットもありません。ゾーン/オフセットが不明または関連しない場合にのみ使用してください。代わりに、そのメソッドを呼び出すときにを使用LocalDateして渡します。Jacob van Lingenによる正しい回答を参照してください。ZoneIdnow
バジルブルク

1
@BasilBourqueあなたの助言の後、私はAPIをチェックし、あなたは完全に正しいので、私は答えを更新します。ありがとう。
albciff、2017年

Brian Montellanoはコメントしたいと思います:には何もないはずsですDateUtils、それだけDateUtilです。
Ole VV 2018

@ OleV.V。ブライアンDateUtils
モンテラーノ

33

これを使用して300日より前の日付を取得し、300をあなたの日で置き換えます。

Date date = new Date(); // Or where ever you get it from
Date daysAgo = new DateTime(date).minusDays(300).toDate();

ここに、

DateTime です org.joda.time.DateTime;

Date です java.util.Date


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

13

Java 8 Time API:

Instant now = Instant.now(); //current date
Instant before = now.minus(Duration.ofDays(300));
Date dateBefore = Date.from(before);

7ではなく、Java 8 APIを意味する必要があります。また、パッケージについて言及するとjava.time役立つ場合があります。また、一部のディスカッション/説明は、一般的にコードスニペットではなく、スタックオーバーフローで予想されます。Durationこれは、van Lingenによる既存の回答に対する回答の付加価値であるため、間違いなく説明する必要があります。
バジルブルク2016年

原因のJava 8、修正済み
Grigory Kislin 2016年

とても近いですが、「今」ではなく任意の日付オブジェクトを変更するためのものでなければなりません
bharal '11 / 11/19

9

あなたが見ることができるようにここにあなたがすることができる操作がたくさんあります。ここにあなたができることを示す例があります!

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();

//Add one day to current date.
cal.add(Calendar.DATE, 1);
System.out.println(dateFormat.format(cal.getTime()));

//Substract one day to current date.
cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(dateFormat.format(cal.getTime()));

/* Can be Calendar.DATE or
*  Calendar.MONTH, Calendar.YEAR, Calendar.HOUR, Calendar.SECOND
*/

@Jigar Joshi:私はあなたの答えを見ませんでした...私を削除する必要がありますか?
waldyr.ar 2012

以下のようなFYI、ひどく面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8に、後に内蔵されたクラス。Oracleによるチュートリアル参照してください。
バジルブルク2018

9

Java 8を使用すると、これは本当に簡単です。

 LocalDate date = LocalDate.now().minusDays(300);

新しいAPIの優れたガイドは、こちらにあります


4
常にオプションのタイムゾーン(またはオフセットからUTC)をそのnowメソッドに渡すことをお勧めします。省略した場合、JVMの現在のデフォルトのタイムゾーンが暗黙的かつ暗黙的に適用されます。このデフォルトはコントロールの外にあり、ランタイムであってもいつでも変更できます。例:LocalDate.now( ZoneId.of( "America/Montreal" )
バジルブルク

「今」ではなく、質問に従って任意の日付オブジェクト上にある必要があります
bharal

1

タスクを簡単にする関数を作成しました。

  • dateStringから7日間: dateCalculate(dateString,"yyyy-MM-dd",7);

  • dateStringまでの7日間を取得するには: dateCalculate(dateString,"yyyy-MM-dd",-7);


public static String dateCalculate(String dateString, String dateFormat, int days) {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat s = new SimpleDateFormat(dateFormat);
    try {
        cal.setTime(s.parse(dateString));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    cal.add(Calendar.DATE, days);
    return s.format(cal.getTime());
}

この回答は、次のような面倒な古い日時のクラスを使用してjava.util.Datejava.util.Calendarjava.text.SimpleDateFormatなっていることをレガシーに取って代わられ、java.timeのクラス。Oracleによるチュートリアルを参照してください。
バジルブルク

質問には、文字列を生成するのではなく、日時オブジェクトが含まれます。ちなみに、LocalDate.parse( "2017-01-23").plusWeeks( 1 )独自のメソッドを書くよりも簡単で、自己文書化されています。
バジルブルク

0

SimpleDateFormatを使用すると、カレンダーで簡単に減算できます

 public static String subtractDate(String time,int subtractDay) throws ParseException {


        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH);
        cal.setTime(sdf.parse(time));
        cal.add(Calendar.DATE,-subtractDay);
        String wantedDate = sdf.format(cal.getTime());

        Log.d("tag",wantedDate);
        return wantedDate;

    }

-4
c1.set(2017, 12 , 01); //Ex: 1999 jan 20    //System.out.println("Date is : " + sdf.format(c1.getTime()));
  c1.add(Calendar.MONTH, -2); // substract 1 month
  System.out.println
  ("Date minus 1 month : "
      + sdf.format(c1.getTime()));

2
SOへようこそ。コードのみの回答はご遠慮ください。stackoverflow.com/help/how-to-answerを参照してください。そして、コードをフォーマットしてください。
Uwe Allner 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.