Javaで日付を1日インクリメントするにはどうすればよいですか?


562

次の形式で日付を処理しています:yyyy-mm-dd

この日付を1日増やすにはどうすればよいですか?


10
Java 8以降を使用している場合は、新しい日付/時刻APIを使用できます。この回答を参照してください:stackoverflow.com/a/23910924/1115554
micha

4
新しいDateTime()。plusDays(1).toDate()???
ピエトロ

回答:


686

このようなことがうまくいくはずです:

String dt = "2008-01-01";  // Start date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(sdf.parse(dt));
c.add(Calendar.DATE, 1);  // number of days to add
dt = sdf.format(c.getTime());  // dt is now the new date

50
@ Esko、c.roll(Calendar.DATE、true)は、月の最終日に月をロールしません。
サム・ハスラー

18
@Ammar理解していなければ悪い考えです
niccolo m。

13
JavaDocsをいくつか引用します... Calendar.DATE:「...これはDAY_OF_MONTHの同義語です。」これにより、より大きなフィールド(月や年など)が増加することをJavaDocsが明確にしたいと思います。Calendar.roll "より大きいフィールドを変更せずに、指定された時間フィールドの時間の単一単位を加算または減算(上/下)" ..繰り返しますが、 "大きいフィールド"は曖昧ですが、サムのコメントと一致しているようです。古いJavaDocsを修正するためのStackOverflowがあればいいのに。
jcalfee314 2012

4
あいにく、残念ながら、DATE、DAY_OF_MONTH、またはDAY_OF_YEARを使用して日を追加することはまったく役に立ちません。これらはすべて係数によって増分されます。したがって、1970年12月31日のカレンダーを考えると、add(DAY_OF_YEAR、1)またはroll()ですが、roll()が最後にadd()を呼び出すと、1970年1月1日になります。時間をミリ秒単位で設定するのが唯一の正しい方法だと思います。私は、Calendarクラスを二度と使用しません。
Dmitry Gryazin 2014

14
@Bagzerg:あなたは間違っているadd()日付をロールします。ideoneを参照してください
Jean Hominal 2015

212

Javaは、C#と比較して、8ボールよりもかなり遅れているように見えます。このユーティリティメソッドは、Java SE 6でCalendar.addメソッドを使用する方法を示しています(おそらく唯一の簡単な方法です)。

public class DateUtil
{
    public static Date addDays(Date date, int days)
    {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, days); //minus number would decrement the days
        return cal.getTime();
    }
}

1日を追加するには、質問ごとに次のように呼び出します。

String sourceDate = "2012-02-29";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = format.parse(sourceDate);
myDate = DateUtil.addDays(myDate, 1);

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

80

java.time

Java 8以降では、java.timeパッケージによってこれがほぼ自動的に行われます。(チュートリアル

String入力と出力を想定:

import java.time.LocalDate;

public class DateIncrementer {
  static public String addOneDay(String date) {
    return LocalDate.parse(date).plusDays(1).toString();
  }
}

3
FYI、両方ZonedDateDateTimeOffsetDateTimeも持っているplusDaysminusDaysメソッドだけでなく、LocalDate
バジルボーク

@BasilBourque確かに、質問で利用できる情報はの情報ですLocalDate
ダニエルC.ソブラル

2
@DanielCSobralうん。読者の啓発のためのリンクを追加するだけです。批判ではありません。
バジルブルク2016年

65

ApacheのDateUtilsを使用することを好みます。これを確認してくださいhttp://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html。これは、プロジェクトで複数の場所で使用する必要があり、このために1つのライナーメソッドを記述したくない場合に特に便利です。

APIは言う:

addDays(Date date、int amount):新しいオブジェクトを返す日付に日数を追加します。

新しいDateオブジェクトを返し、前のオブジェクト自体は変更しないことに注意してください。


59
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse( inputString ) );
cal.add( Calendar.DATE, 1 );

48

Calendarオブジェクトを作成し、メソッドadd(Calendar.DATE、1);を使用します。


43

Joda-Time(https://www.joda.org/joda-time/)をご覧ください

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

String nextDay = parser.print(date.plusDays(1));

3
DateTimeを構築するためのパーサー呼び出しを削除できます。DateTimeを使用するdate = new DateTime(dateString); 次に、nextDayはISODateTimeFormat.date()。print(date.plusDays(1));です。詳細については、joda-time.sourceforge.net / api-release / org / joda / time /…を参照してください。
MetroidFan2002 2009年

Joda-Timeを使用したより詳細なサンプルコードについて、同様の質問への私の回答を参照しください
バジルブルク2013年

2
参考までに... Joda -Timeプロジェクトは現在メンテナンスモードにあり、java.timeクラスへの移行を推奨しています。どちらの取り組みも、同じ人物であるスティーブンコールボーンが主導しました。したがって、それらは同様の概念を共有し、移行は難しくありません。
バジルブルク

40

この行は24時間を追加することに注意してください:

d1.getTime() + 1 * 24 * 60 * 60 * 1000

この行は1日を追加します

cal.add( Calendar.DATE, 1 );

夏時間の変更がある日(25または23時間)では、異なる結果が得られます。


40

Java 8では、日付と時刻を操作するための新しいAPIが追加されました。

Java 8では、次のコード行を使用できます。

// parse date from yyyy-mm-dd pattern
LocalDate januaryFirst = LocalDate.parse("2014-01-01");

// add one day
LocalDate januarySecond = januaryFirst.plusDays(1);

1
あなたはjanuaryFirst.plusDays(1)そうではなかったと思いますdate.plusDays(1)
TeWu 2016


1
@Subho 26より前のAndroidについては、ThreeTen-Backportプロジェクトを適応するThreeTenABPプロジェクトを参照してください。これは、ほとんどのjava-time機能がJava 6およびJava 7に対応している場合のバックポートです
Basil Bourque

29

Simple java.util libを使用できます

Calendar cal = Calendar.getInstance(); 
cal.setTime(yourDate); 
cal.add(Calendar.DATE, 1);
yourDate = cal.getTime();

1
この回答は、3年前に承認された回答を含む複数の回答の内容を複製したものです。回答を削除するか、編集して値を追加してください。
バジルブルク2015年

3
この答えはよりわかりやすく、途中で日付を解析しません。「受け入れられた答え」は複雑すぎます。バジルの自動発言を無視して、よろしいですか
ミッキーペルスタイン

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

正直言って、正解です。私はミッキーに同意します、バジルのコメントは無視してください
eramirez75

23
Date today = new Date();               
SimpleDateFormat formattedDate = new SimpleDateFormat("yyyyMMdd");            
Calendar c = Calendar.getInstance();        
c.add(Calendar.DATE, 1);  // number of days to add      
String tomorrow = (String)(formattedDate.format(c.getTime()));
System.out.println("Tomorrows date is " + tomorrow);

これで明日の日付がわかります。c.add(...)パラメータは、適切な増分のために1から別の数値に変更できます。


1
追加する前に特定の日付を設定するためにc.setTime(Dateオブジェクト)のようなことを行うことができます。
Linh Lino 2014年

デフォルトのJavaパッケージで日付の処理が複雑にならないようにしたいのですが...日付を処理するたびに大変なことです...ただの
怒り

1
@Shn_Android_Dev Java 8以降に組み込まれたjava.timeクラスは、ひどい古い日時クラスに取って代わり、あなたの希望に答えます。また、ThreeTen-BackportプロジェクトとThreeTenABPプロジェクトでJava 6/7以前のAndroidにバックポートされました。これまでに使用する必要はありませんDateCalendarもう一度。
バジルブルク

19

Java 8を使用している場合は、次のようにします。

LocalDate sourceDate = LocalDate.of(2017, Month.MAY, 27);  // Source Date
LocalDate destDate = sourceDate.plusDays(1); // Adding a day to source date.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // Setting date format

String destDate = destDate.format(formatter));  // End date

SimpleDateFormatを使用する場合は、次のようにします。

String sourceDate = "2017-05-27";  // Start date

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf.parse(sourceDate)); // parsed date and setting to calendar

calendar.add(Calendar.DATE, 1);  // number of days to add
String destDate = sdf.format(calendar.getTime());  // End date

いいえ、質問は日時ではなく日付のみの値を要求しました。だからLocalDateクラスではないを使用しLocalDateTimeます。
バジルブルク2017年

1
あなたの回答は、少なくとも4つの他の回答の内容を繰り返します。賛成票を集める前に、それらがどのように価値を追加するか、または削除するかを説明してください。
バジルブルク2017年

16
long timeadj = 24*60*60*1000;
Date newDate = new Date (oldDate.getTime ()+timeadj);

これは、oldDateのエポックからのミリ秒数を取り、1日分のミリ秒を追加してから、Date()パブリックコンストラクターを使用して、新しい値を使用して日付を作成します。この方法では、1日だけでなく、1日または任意の時間/分を追加できます。


これはおそらくOPが望んでいたものではありません。夏時間タイプの調整、うるう秒などは考慮されていません。
mrec '18

1
夏時間はタイムゾーン/ロケールで処理する必要があります。私の例では、短い期間でインクリメントする方法を示していました。日単位で増加する場合はうるう秒が問題になる可能性がありますが、時間を追加する場合は可能ですが、可能性は低くなります。
dvaey 2014

15

Java 1.5 以降、TimeUnit.DAYS.toMillis(1)の方がきれいに見えます。

SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Date day = dateFormat.parse(string);
// add the day
Date dayAfter = new Date(day.getTime() + TimeUnit.DAYS.toMillis(1));

これにより、質問が日付のみを要求する日時値が作成されます。LocalDateJava 8以降のjava.timeクラスのクラスと、ThreeTen-Backportプロジェクトで見つかったJava 6およびJava 7へのバックポートは、より賢明なアプローチになると思います。
バジルブルク2017


11

Java 8では、使用できます java.time.LocalDate

LocalDate parsedDate = LocalDate.parse("2015-10-30"); //Parse date from String
LocalDate addedDate = parsedDate.plusDays(1);   //Add one to the day field

java.util.Date次のようにしてオブジェクトに変換できます。

Date date = Date.from(addedDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

LocalDate次のようにして、文字列に形成できます。

String str = addedDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

11

それは非常に単純で、簡単な言葉で説明しようとします。以下のように今日の日付を取得します

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());// print today's date
calendar.add(Calendar.DATE, 1);

(定数、値)をとるcalendar.addメソッドによって、この日付を1日先に設定します。ここで定数は、日付、時間、分、秒などであり、値は定数の値です。1日と同様に、前の定数はCalendar.DATEであり、1日先の値が必要なため、その値は1です。

System.out.println(calendar.getTime());// print modified date which is 明日の日付

ありがとう



7

文字列と次の日数で日付を渡すだけです

 private String getNextDate(String givenDate,int noOfDays) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        String nextDaysDate = null;
    try {
        cal.setTime(dateFormat.parse(givenDate));
        cal.add(Calendar.DATE, noOfDays);

       nextDaysDate = dateFormat.format(cal.getTime());

    } catch (ParseException ex) {
        Logger.getLogger(GR_TravelRepublic.class.getName()).log(Level.SEVERE, null, ex);
    }finally{
    dateFormat = null;
    cal = null;
    }

    return nextDaysDate;

}

7

単一の時間単位を追加する必要があり、他のフィールドも同様に増加することが予想される場合は、addメソッドを安全に使用できます。以下の例をご覧ください。

SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.set(1970,Calendar.DECEMBER,31);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, 1);
System.out.println(simpleDateFormat1.format(cal.getTime()));
cal.add(Calendar.DATE, -1);
System.out.println(simpleDateFormat1.format(cal.getTime()));

印刷されます:

1970-12-31
1971-01-01
1970-12-31

受け入れられた答えはなく、他のフィールドも同様に更新される場合、全体的に混乱があると感じました。
テルミット2015

7
startCalendar.add(Calendar.DATE, 1); //Add 1 Day to the current Calender

4
貢献していただきありがとうございます。私は本当にそのIMHOの誰もが、設計が不十分なと長い時代遅れ使うべきではありません離れてから...何のポイントを見ていないので、しかし、これは、他の回答のいくつかに既にあるCalendar2019でクラスを
オレVV

6

Java SE 8以降を使用している場合は、新しい日付/時刻APIを使用する必要があります

 int days = 7;       
 LocalDate dateRedeemed = LocalDate.now();
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/YYYY");

 String newDate = dateRedeemed.plusDays(days).format(formatter);   
 System.out.println(newDate);

からjava.util.Dateに変換する必要がある場合はjava.time.LocalDate、このメソッドを使用できます。

  public LocalDate asLocalDate(Date date) {
      Instant instant = date.toInstant();
      ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
      return zdt.toLocalDate();
  }

Java SE 8より前のバージョンを使用している場合は、Joda-Timeを使用することをお勧めします

Joda-Timeは、Javaの日付と時刻のクラスに代わる品質の高いもので、Java SE 8より前のJavaの事実上の標準の日付と時刻のライブラリです。

   int days = 7;       
   DateTime dateRedeemed = DateTime.now();
   DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/uuuu");

   String newDate = dateRedeemed.plusDays(days).toString(formatter);   
   System.out.println(newDate);

1
java.timeパーツのパターンが正しくありません。dd/MM/uuuuJodaTimeと同等である必要があります。
TiiJ7

5

DateFormatAPIを使用して文字列をDateオブジェクトに変換し、APIを使用してCalendar1日を追加します。特定のコード例が必要な場合はお知らせください。回答を更新できます。


3

あなたは、Java 8を使用している、場合java.time.LocalDate及びjava.time.format.DateTimeFormatterこの作品は非常にシンプルにすることができます。

public String nextDate(String date){
      LocalDate parsedDate = LocalDate.parse(date);
      LocalDate addedDate = parsedDate.plusDays(1);
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-mm-dd");
      return addedDate.format(formatter); 
}

さらにシンプル:フォーマッターをドロップtoString()して、文字列i yyyy-MM-dd形式を生成するために使用します(そして、主張する場合は、月mmは分であることに注意してくださいMM)。
Ole VV

3

「org.apache.commons.lang3.time」からこのパッケージを使用できます。

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 Date myNewDate = DateUtils.addDays(myDate, 4);
 Date yesterday = DateUtils.addDays(myDate, -1);
 String formatedDate = sdf.format(myNewDate);  

5
Date2018年にクラスを提案することはあまりお勧めできません。以下のような面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8&9のJavaを参照してくださいに組み込まれたクラスのチュートリアル OracleでLocalDateクラスを使用して他の回答を参照してください。
バジルブルク2018

そうです、LocalDateがそのための最良の方法です
Shaheed

ただし、jsfなどの一部のフレームワークには、time APIとの統合に関する小さな問題があるため、Dateを使用する必要がある場合があります。plus java <8
Lucke

1
@Luckeほとんどのjava.time機能は、ThreeTen-BackportプロジェクトでJava 6および7にバックポートされました。ThreeTenABPプロジェクトの古いAndroidにさらに適合。したがって、これらの流血のひどい古い日時クラスに触れる必要はまったくありません。多くのフレームワークが更新されました。すべてではありません。あなたはまだに更新されていない古いコードと相互運用しなければならないのであればjava.time、に新しいコードを書くjava.time古いクラスに追加された新しい変換メソッドを呼び出すことにより、古いタイプから/へと変換します。
バジルブルク

1
このコードは、タイムゾーンの重要な問題を無視します。いつでも、日付はゾーンごとにグロブの周りで異なります。SimpleDateFormat残念ながら、このクラスはタイムゾーンを挿入し、JVMの現在のデフォルトゾーンを暗黙的に適用します。したがって、このコードの結果は、現在のデフォルトが何であれ、変化します。そのデフォルトは実行時のどの時点でも変わる可能性があります。
バジルブルク2018年

3

それは実際には簡単です。1日には86400000ミリ秒が含まれます。したがって、まずシステムから現在の時間をミリ秒で取得し、System.currentTimeMillis()次に84000000ミリ秒を追加して、Dateミリ秒単位ミリ秒をクラスをしてミリ秒の日付形式を生成します。

String Today = new Date(System.currentTimeMillis()).toString();

String Todayは2019-05-9になります

String Tommorow = new Date(System.currentTimeMillis() + 86400000).toString();

String Tommorowは2019-05-10になります

String DayAfterTommorow = new Date(System.currentTimeMillis() + (2 * 86400000)).toString();

文字列DayAfterTommorowは2019-05-11になります


このコードは、Date数年前に現代のjava.timeクラスに取って代わられた恐ろしいクラスを使用しています。単純に使用する方がはるかに簡単:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
バジルブルク

2

ユースケースを明確にしましょう:カレンダー演算を行い、java.util.Dateで開始/終了したいとします

いくつかのアプローチ:

  1. 文字列に変換してSimpleDateFormatで戻す:これは非効率的なソリューションです。
  2. LocalDateに変換:時刻情報が失われます。
  3. LocalDateTimeに変換:これには、より多くのステップが含まれ、タイムゾーンを心配する必要があります。
  4. Date.getTime()を使用してエポックに変換します。これは効率的ですが、ミリ秒で計算しています。

java.time.Instantの使用を検討してください

Date _now = new Date();
Instant _instant = _now.toInstant().minus(5, ChronoUnit.DAYS);
Date _newDate = Date.from(_instant);

1
などの恐ろしいレガシークラスを、などDateの最新のjava.timeクラスと混在させないでくださいInstantjava.timeのクラスは完全にレガシークラスに取って代わります。具体的にInstantは、を置き換えjava.util.Dateます。
バジルブルク2018年

1
質問は扱いません。モーメント(オフセットまたはゾーンのコンテキストでの時刻付きの日付)を表すクラスを使用しています。しかし、質問は、時刻とタイムゾーンなしの日付のみについて尋ねます。Sobral による正しい回答とmicha による正しい回答を参照してください。
バジルブルク2018年

0
Date newDate = new Date();
newDate.setDate(newDate.getDate()+1);
System.out.println(newDate);

14
fyi、Date.setDate()は非推奨
ケリーS.フランス語

私のコンピューターでは、1か月の国境を越えて動作するようです。あとSun Apr 30 16:25:33 CEST 2017来るよMon May 01 16:25:33 CEST 2017。しかし、それはまだ落胆した解決策です。このメソッドは、正当な理由で廃止されただけでなく、2017年にはDateクラスに代わる非常に優れた代替手段があります。
Ole VV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.