特定の日に1日を加えたい。どうやってやるの?
Date dt = new Date();
今、私はこの日に一日を加えたいと思います。
Date dt
を考えると、いくつかの可能性があります。
解決策1:そのためにCalendar
クラスを使用できます。
Date dt = new Date();
Calendar c = Calendar.getInstance();
c.setTime(dt);
c.add(Calendar.DATE, 1);
dt = c.getTime();
解決策2:Joda-Timeライブラリの使用を真剣に検討する必要があります、Date
クラスのさまざまな欠点のため。 Joda-Timeを使えば、次のことができます。
Date dt = new Date();
DateTime dtOrg = new DateTime(dt);
DateTime dtPlusOne = dtOrg.plusDays(1);
解決策3:Java 8を使うと、新しいJSRも使用できます。 310API(Joda-Timeから着想を得たもの):
Date dt = new Date();
LocalDateTime.from(dt.toInstant()).plusDays(1);
Date today = new Date();
Date tomorrow = new Date(today.getTime() + (1000 * 60 * 60 * 24));
DateにはUNIX-Epochからのミリ秒を使ったコンストラクタがあります。 getTime() - メソッドはあなたにその値を与えます。 1日のミリ秒数を足すと、うまくいきます。このような操作を定期的に行いたい場合は、値に定数を定義することをお勧めします。
重要なヒント:それはすべての場合で正しくありません。下記の警告コメントを読んでください。
トップの回答で述べたように、Java 8以降では以下のことが可能です。
Date dt = new Date();
LocalDateTime.from(dt.toInstant()).plusDays(1);
しかし、これは時々このようなDateTimeException
につながることができます:
Java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2014-11-29T03:20:10.800Z of type Java.time.Instant
単にタイムゾーンを渡すことでこの例外を回避することが可能です。
LocalDateTime.from(dt.toInstant().atZone(ZoneId.of("UTC"))).plusDays(1);
LocalDate.of( 2017 , Month.JANUARY , 23 )
.plusDays( 1 )
Java.util.Date
クラスを完全に避けるのが最善です。ただし、そうする必要がある場合は、面倒な古いレガシーの日時クラスと最新のJava.timeクラスの間で変換できます。古いクラスに追加された新しいメソッドに注目してください。
Instant
Instant
クラスは、Date
とほぼ同等であり、どちらもタイムライン上の瞬間です。 Instant
はナノ秒に解決されますが、Date
はミリ秒です。
Instant instant = myUtilDate.toInstant() ;
これに1日追加することもできますが、UTCではこれに留意してください。そのため、夏時間などの異常は考慮されません。 ChronoUnit
クラスで時間単位を指定します。
Instant nextDay = instant.plus( 1 , ChronoUnit.DAYS ) ;
ZonedDateTime
タイムゾーンに精通したい場合は、ZoneId
を指定してZonedDateTime
を取得します。 適切なタイムゾーン名 を、 continent/region
、 America/Montreal
、またはAfrica/Casablanca
などのPacific/Auckland
の形式で指定します。 EST
やIST
などの3〜4文字の略語は、notであり、標準化されておらず、一意(!)でもないため、絶対に使用しないでください。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
ZonedDateTime zdtNextDay = zdt.plusDays( 1 ) ;
また、追加する期間(1日)をPeriod
として表すこともできます。
Period p = Period.ofDays( 1 ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ).plus( p ) ;
その翌日の最初の瞬間が欲しいかもしれません。日が00:00:00から始まると想定しないでください。夏時間(DST)などの異常は、その日が01:00:00などの別の時間に始まることを意味します。Java.timeに、そのゾーンのその日の1日の最初の瞬間を決定させます。
LocalDate today = LocalDate.now( z ) ;
LocalDate tomorrow = today.plus( p ) ;
ZonedDateTime zdt = tomorrow.atStartOfDay( z ) ;
Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.Date
、 Calendar
、& SimpleDateFormat
などの厄介な古い legacy date-timeクラスに取って代わります。
Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。
Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠する JDBCドライバー を使用します。文字列もJava.sql.*
クラスも必要ありません。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
、および more などの便利なクラスがあります。
更新: Joda-Timeライブラリがメンテナンスモードになりました。チームは、Java.timeクラスへの移行を推奨しています。このセクションは歴史のためにそのまま残しています。
Joda-Time 2.3ライブラリを使用すると、このような日時の作業がはるかに簡単になります。 JavaにバンドルされているJava.util.Dateクラスは面倒なことで有名なので、避けるべきです。
以下にコード例を示します。
Java.util.DateはJoda-Time DateTime オブジェクトに変換されます。 j.u.Dateとは異なり、DateTimeは割り当てられたタイムゾーンを本当に認識しています。同じ 壁時計時間 明日を取得するために日を追加することは、 夏時間( DST) ここ米国で。 タイムゾーン を指定すると、Joda-Timeはそのような調整を行うことができます。日を追加した後、DateTimeオブジェクトをJava.util.Dateオブジェクトに変換します。
Java.util.Date yourDate = new Java.util.Date();
// Generally better to specify your time zone rather than rely on default.
org.joda.time.DateTimeZone timeZone = org.joda.time.DateTimeZone.forID( "America/Los_Angeles" );
DateTime now = new DateTime( yourDate, timeZone );
DateTime tomorrow = now.plusDays( 1 );
Java.util.Date tomorrowAsJUDate = tomorrow.toDate();
コンソールにダンプ…
System.out.println( "yourDate: " + yourDate );
System.out.println( "now: " + now );
System.out.println( "tomorrow: " + tomorrow );
System.out.println( "tomorrowAsJUDate: " + tomorrowAsJUDate );
実行すると…
yourDate: Thu Apr 10 22:57:21 PDT 2014
now: 2014-04-10T22:57:21.535-07:00
tomorrow: 2014-04-11T22:57:21.535-07:00
tomorrowAsJUDate: Fri Apr 11 22:57:21 PDT 2014
Dateオブジェクトに任意の時間を追加する簡単な方法を見つけました
Date d = new Date(new Date().getTime() + 86400000)
どこで:
86 400 000ms = 1 Day : 24*60*60*1000
3 600 000ms = 1 Hour : 60*60*1000
これにより、日付が1つ増えます
String untildate="2011-10-08";//can take any date in current format
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
Calendar cal = Calendar.getInstance();
cal.setTime( dateFormat.parse(untildate));
cal.add( Calendar.DATE, 1 );
String convertedDate=dateFormat.format(cal.getTime());
System.out.println("Date increase by one.."+convertedDate);
このメソッドは import org.Apache.commons.lang.time.DateUtils の後に使用できます。
DateUtils.addDays(new Date(), 1));
Java 8 LocalDate API
LocalDate.now().plusDays(1L);
日付と時刻の計算には、 joda をお勧めします。
Date tomorrow = now().plusDays(1).toDate();
または
endOfDay(now().plus(days(1))).toDate()
startOfDay(now().plus(days(1))).toDate()
dateTimeオブジェクトobj.Addを使用して、一日の時間などに必要なものを追加します。これが機能することを願っています:)
それを少しJava固有のものにしないようにするために、基本的な原則は、ある線形日付形式、ユリウス日、修正ユリウス日、エポックからの秒数などに変換し、日を追加して元に戻すことです。
これをする理由は、あなたが「うるう日、うるう秒などの権利を得る」という問題を、運が良ければ、この問題を解決していない人に頼りにしているからです。
これらの変換ルーチンを正しくするのは難しい場合があることに注意してください。人々が時間を混乱させる驚くべき数の異なる方法があります、最も注目されている例はMSのZuneでした。 MSであまりにも面白くしすぎないでください、それはめちゃくちゃ簡単です。 TAIとTTのように、複数の異なる時間形式があることは意味がありません。
使用するのに最適なもの:
long currenTime = System.currentTimeMillis();
long oneHourLater = currentTime + TimeUnit.HOURS.toMillis(1l);
同様に、月、日、分などを追加することができます。
非常に特別な場合あなたのコンピュータプログラミング教授から、あなた自身の日付クラスをするように頼んだならば。この方法はとても良い仕事をするでしょう。
public void addOneDay(){
int [] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
day++;
if (day> months[month-1]){
month++;
day = 1;
if (month > 12){
year++;
month = 1;
}
}
}
Java 1.8バージョンには、データタイムAPI用のNiceアップデートがあります。
これがコードの断片です。
LocalDate lastAprilDay = LocalDate.of(2014, Month.APRIL, 30);
System.out.println("last april day: " + lastAprilDay);
LocalDate firstMay = lastAprilDay.plusDays(1);
System.out.println("should be first may day: " + firstMay);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd");
String formatDate = formatter.format(firstMay);
System.out.println("formatted date: " + formatDate);
出力:
last april day: 2014-04-30
should be first may day: 2014-05-01
formatted date: 01
詳細については、このクラスへのJavaドキュメントを参照してください。
私たちがJava 8でそれを行うことができる方法を紹介します。どうぞ:
public class DemoDate {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println("Current date: " + today);
//add 1 day to the current date
LocalDate date1Day = today.plus(1, ChronoUnit.DAYS);
System.out.println("Date After 1 day : " + date1Day);
}
}
出力:
Current date: 2016-08-15
Date After 1 day : 2016-08-16
このコードを試してみてください。
public Date getToDateAfterDays(Integer day) {
Date nowdate = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(nowdate);
cal.add(Calendar.DATE, day);
return cal.getTime();
}
Java 8 Time API:
Instant now = Instant.now(); //current date
Instant after= now.plus(Duration.ofDays(300));
Date dateAfter = Date.from(after);
UはこのようにJava.util.Date
ライブラリを試すことができます -
int no_of_day_to_add = 1;
Date today = new Date();
Date tomorrow = new Date( today.getYear(), today.getMonth(), today.getDate() + no_of_day_to_add );
必要に応じてno_of_day_to_add
の値を変更してください。
私はno_of_day_to_add
の値を1
に設定しました。なぜなら、uは1日だけ追加したいからです。
このドキュメント にもっと多くの情報があります。