Java'da bir tarihi nasıl bir gün artırabilirim?


561

Bu biçimde bir tarihle çalışıyorum: yyyy-mm-dd .

Bu tarihi bir gün nasıl artırabilirim?


10
Java 8 veya daha yenisini kullanıyorsanız yeni tarih / saat API'sini kullanabilirsiniz. Şu cevaba bakın: stackoverflow.com/a/23910924/1115554
micha

4
yeni DateTime (). plusDays (1) .toDate () ???
Pietro

Yanıtlar:


684

Böyle bir şey hile yapmalıdır:

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) ayı ayın son gününde yuvarlamaz.
Sam Hasler

18
@Ammar, bir şey anlamadıysanız kötü bir fikir
niccolo m.

13
Bazı JavaDocs alıntı yapacağım ... Calendar.DATE: "... Bu DAY_OF_MONTH ile eşanlamlıdır." Keşke JavaDocs bunun daha geniş alanları (ay ve yıl gibi) artıracağını açıklığa kavuşturacaktı. Calendar.roll "Daha büyük alanları değiştirmeden verilen zaman alanına tek bir zaman birimi ekler veya çıkarır (yukarı / aşağı)" .. Yine, "daha büyük alanlar" belirsizdir, ancak Sam'in yorumuyla tutarlı görünüyor. Keşke eski JavaDocs düzeltmek için bir StackOverflow olsaydı.
jcalfee314

4
çocuklar, ne yazık ki, DATE, DAY_OF_MONTH veya hatta DAY_OF_YEAR kullanarak gün eklemek oldukça işe yaramaz - hepsi modül tarafından artırılır. Bu nedenle 31-12-1970 Takvimi göz önüne alındığında, (DAY_OF_YEAR, 1) veya roll () ekleyin, ancak roll () sonunda add () öğesini çağırır, 01-01-1970 verir. Sanırım tek doğru yol milisaniye ile zaman ayarlamaktır. Bana gelince, bir daha asla Calendar sınıfını kullanmıyorum.
Dmitry Gryazin

14
@Bagzerg: Yanılıyorsunuz . add()tarihi atar. İdeone bakın .
Jean Hominal

211

Java, C # ile karşılaştırıldığında sekiz topun çok gerisinde görünüyor. Bu yardımcı program, Calendar.add yöntemini (muhtemelen tek kolay yol) kullanarak Java SE 6'da yapmanın yolunu gösterir .

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();
    }
}

Bir gün eklemek için, sorulan soru başına, aşağıdaki gibi arayın:

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

4
Bilginize gibi korkunç zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

79

java.time

Java 8 ve sonraki sürümlerinde java.time paketi bunu hemen hemen otomatik hale getirir. ( Eğitim )

StringGirdi ve çıktı varsayıldığında :

import java.time.LocalDate;

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

3
Bilginize, hem ZonedDateDateTimeve OffsetDateTimeayrıca sahip plusDaysve minusDaysyöntemleri yanı sıraLocalDate
Fesleğen Bourgue

@BasilBourque Elbette, ancak soruda mevcut olan bilgiler a LocalDate.
Daniel

2
@DanielCSobral Yep. Sadece okuyucularınızın eğitimi için bağlantılar eklemek. Bir eleştiri değil.
Basil Bourque

65

Apache'den DateUtils kullanmayı tercih ediyorum . Bu http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html adresini kontrol edin . Özellikle projenizde birden fazla yer kullanmanız gerektiğinde kullanışlıdır ve bunun için bir astar yönteminizi yazmak istemezsiniz.

API diyor ki:

addDays (Tarih tarihi, int tutarı): Yeni bir nesne döndüren bir tarihe birkaç gün ekler.

Yeni bir Date nesnesi döndürdüğünü ve bir öncekinin kendisinde değişiklik yapmadığını unutmayın.


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

48

Bir Calendar nesnesi oluşturun ve add yöntemini kullanın (Calendar.DATE, 1);


43

Joda-Time'a bir göz atın ( https://www.joda.org/joda-time/ ).

DateTimeFormatter parser = ISODateTimeFormat.date();

DateTime date = parser.parseDateTime(dateString);

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

3
DateTime oluşturmak için ayrıştırıcı çağrılarını kaldırabilirsiniz. DateTime kullan tarih = yeni DateTime (dateString); Ardından nextDay ISODateTimeFormat.date () şeklindedir. Print (date.plusDays (1)); Daha fazla bilgi için joda-time.sourceforge.net/api-release/org/joda/time/… adresine bakın .
MetroidFan2002

Joda-Time, bkz kullanarak daha ayrıntılı bir örnek kodu için Cevabımı benzer bir soruya, nasıl bir tarihe bir gün eklenir? .
Basil Bourque

2
Bilginize… Joda-Time projesi şu anda bakım modunda ve java.time sınıflarına geçişi tavsiye ediyor . Her iki çaba da aynı adam Stephen Colebourne tarafından yönetildi. Dolayısıyla benzer kavramları paylaşıyorlar ve göç zor değil.
Basil Bourque

40

Lütfen bu satırın 24 saat eklediğini unutmayın:

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

ama bu satır bir gün ekliyor

cal.add( Calendar.DATE, 1 );

Yaz saati uygulaması değişikliği olan günlerde (25 veya 23 saat) farklı sonuçlar elde edersiniz!


40

Java 8, tarih ve saatlerle çalışmak için yeni bir API ekledi.

Java 8 ile aşağıdaki kod satırlarını kullanabilirsiniz:

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

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

1
Sanırım januaryFirst.plusDays(1)istemiyordun date.plusDays(1).
TeWu


1
@Subho 26'dan önce Android için , java-zaman işlevselliğinin çoğu Java 6 ve Java 7'ye uygunsa bir arka liman olan ThreeTen-Backport projesini uyarlayan ThreeTenABP projesine bakın .
Basil Bourque

29

Basit java.util lib kullanabilirsiniz

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

1
Bu Yanıt , üç yıl önceki kabul edilen Yanıt dahil olmak üzere birden çok Yanıtın içeriğini çoğaltır . Değer eklemek için lütfen Yanıtınızı silin veya düzenleyin.
Basil Bourque

3
bu cevap daha temiz, ortadaki tarihi ayrıştırmıyor. "kabul edilen cevap" çok kıvrık. sizinkini
eklemeniz

Bilginize gibi korkunç zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

En iyi cevap, doğrudan noktaya. Mickey ile aynı fikirdeyim, sadece fesleğen yorumunu dikkate almayın
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);

Bu yarının tarihini verecektir. c.add(...)parametreler uygun artış için 1'den başka bir sayıya değiştirilebilir.


1
eklemeden önce belirli bir Tarih ayarlamak için c.setTime (Tarih nesnesi) gibi bir şey yapabilirsiniz.
Linh Lino

Keşke varsayılan java paketleri taşıma tarihlerinin daha az kıvrımlı olmasını isterdim ... Yani tarihlerle uğraşmak istediğinizde böyle bir acı ... sadece bir rant ...
Shn_Android_Dev

1
@Shn_Android_Dev Java 8 ve sonraki sürümlerinde yerleşik olarak bulunan java.time sınıfları, korkunç eski tarih-saat sınıflarını tamamlar ve isteğinizi yanıtlar. Ayrıca ThreeTen-Backport ve ThreeTenABP projelerinde Java 6/7 ve önceki Android sürümlerine geri taşındı . Tekrar Dateveya Calendartekrar kullanmaya gerek yok .
Basil Bourque

19

Java 8 kullanıyorsanız , böyle yapın.

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 kullanmak istiyorsanız , bunu böyle yapın.

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

Hayır, Soru, tarih-saat değil, yalnızca tarih değeri istedi. Bu yüzden LocalDatesınıfı kullanmayın LocalDateTime.
Basil Bourque

1
Yanıtınız, en az dört diğer Yanıtın içeriğini tekrar eder. Lütfen sizinkilerin bunların ötesine nasıl değer kattığını açıklayın veya aşağı oy toplamadan önce silin.
Basil Bourque

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

Bu, oldDate döneminden bu yana geçen milisaniye sayısını alır ve 1 gün değerinde milisaniye ekler, ardından yeni değeri kullanarak bir tarih oluşturmak için Date () genel yapıcısını kullanır. Bu yöntem, yalnızca tam günleri değil, 1 gün veya istediğiniz sayıda saat / dakika eklemenizi sağlar.


Muhtemelen OP'nin istediği bu değil; Gün Işığı Tasarrufu tipi ayarlamalar, artık saniye sayısı vb. için herhangi bir izin vermez.
mrec

1
Gün ışığından yararlanma saati, saat dilimi / yerel ayar tarafından gerçekleştirilmelidir. Benim örneğim küçük sürelerle nasıl artırılacağını gösteriyordu. Günlere göre arttıkça artık saniye sorunu olabilir, ancak saat eklerken hala mümkün olmasına rağmen daha az olasıdır.
dvaey

15

Java 1.5'ten beri TimeUnit.DAYS.toMillis (1) bana daha temiz görünüyor.

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));

Bu, Sorunun yalnızca bir tarih istediği bir tarih-saat değeri oluşturur. LocalDateJava 8 ve üstü için java.time sınıflarındaki sınıf ve ThreeTen-Backport projesinde bulunan Java 6 ve Java 7'ye arka bağlantı noktası olduğunu çok daha akıllıca bir yaklaşım olarak öneriyorum .
Basil Bourque


11

Java 8'de şunları kullanabilirsiniz: 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.DateNesneye aşağıdaki gibi dönüştürebilirsiniz .

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

Sen format edebilirsiniz LocalDateşöyle bir Dizesi'ne.

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

11

Çok basit, basit bir kelimeyle açıklamaya çalışmak. bugünün tarihini aşağıdaki gibi al

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

Şimdi (sabit, değer) alan calendar.add yöntemiyle bu tarihle bir gün önceden ayarlayın. Burada sabit DATE, saat, dakika, saniye vb. Olabilir ve değer sabitin değeridir. Bir gün gibi, ön sabit de Calendar.DATE ve değeri 1'dir, çünkü bir gün ileri değeri istiyoruz.

System.out.println(calendar.getTime());// print modified date which is yarının tarihi

Teşekkürler



7

Dizeyi ve sonraki gün sayısını girmeniz yeterlidir

 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

Tek bir zaman birimi eklemek istiyorsanız ve diğer alanların da artırılmasını bekliyorsanız, add yöntemini güvenle kullanabilirsiniz. Aşağıdaki örneğe bakın:

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()));

Yazdırılacak:

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

Kabul edilen bir cevap yok ve diğer alanlar da güncellenirse genel karışıklık olduğunu hissettim.
terrmith

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

4
Katkıda bulunmak istediğiniz için teşekkür ederiz. Bununla birlikte, bu zaten diğer cevapların birçoğunda, bu yüzden gerçekten bir anlam görmüyorum ... IMHO dışında, hiç kimse Calendar2019'da kötü tasarlanmış ve eski modası geçmiş sınıfı kullanmamalıdır.
Ole VV

6

Java SE 8 veya üstünü kullanıyorsanız yeni Tarih / Saat API'sını kullanmanız gerekir

 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);

Hedefine dönüştürmeniz java.util.Dategerekiyorsa java.time.LocalDate, bu yöntemi kullanabilirsiniz.

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

Java SE 8'den önceki bir sürümü kullanıyorsanız Joda-Time'ı kullanmanızı öneririm

Joda-Time, Java tarih ve saat sınıfları için kaliteli bir değiştirme sağlar ve Java SE 8'den önce Java için fiili standart tarih ve saat kütüphanesidir

   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.timeParça için deseniniz yanlış. dd/MM/uuuuJodaTime'a eşdeğer olmalıdır .
TiiJ7

5

DateFormatDizeyi bir Date nesnesine dönüştürmek için API'yı kullanın , ardından Calendarbir gün eklemek için API'yı kullanın. Belirli kod örnekleri istiyorsanız bana bildirin ve cevabımı güncelleyebilirim.


3

Java 8 kullanıyorsanız java.time.LocalDateve java.time.format.DateTimeFormatterbu işi oldukça basit hale getirebiliyorsanız.

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); 
}

Daha da basit: Biçimlendiriciyi bırakın ve toString()i yyyy-AA-gg biçimini oluşturmak için kullanın (ve ısrar ederseniz , ayın mmdakika olduğunu unutmayın MM).
Ole VV

3

Bu paketi "org.apache.commons.lang3.time" adresinden kullanabilirsiniz:

 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
Önerme Date2018 yılında sınıf yoksul tavsiyedir. Gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time Java 8 ve Java 9. Bkz yerleşik sınıflara Öğreticisi Oracle tarafından . LocalDateSınıfı kullanarak diğer Yanıtlara bakın .
Basil Bourque

Evet öyle, LocalDate bunu yapmanın en iyi yoludur,
Shaheed

ancak jsf gibi bazı çerçevelerin time API ile küçük entegrasyon sorunları vardır, bu nedenle bazen Date kullanmalısınız; artı çevre java <8
Lucke

1
@Lucke Java.time işlevselliğinin çoğu , ThreeTen-Backport projesinde Java 6 ve 7'ye geri taşındı . Ayrıca ThreeTenABP projesinde eski Android'e uyarlandı . Yani, bu kanlı korkunç eski tarih-saat sınıflarına dokunmaya gerek yok. Birçok çerçeve güncellendi. Fakat hepsi değil. Bu nedenle, java.time için henüz güncellenmemiş eski kodlarla birlikte çalışmanız gerekiyorsa , yeni kodunuzu java.time içine yazın ve eski sınıflara eklenen yeni dönüştürme yöntemlerini çağırarak eski türlere / türlerinden dönüştürün.
Basil Bourque

1
Bu kod , saat diliminin önemli sorununu yok sayar . Herhangi bir an için, tarih globun çevresinde bölgeye göre değişir. SimpleDateFormatSınıf maalesef örtülü JVM geçerli varsayılan dilimini uygulayarak, bir saat dilimi enjekte eder. Bu nedenle, bu kodun sonuçları, geçerli varsayılanın ne olduğuna göre değişir - ve bu varsayılan, çalışma zamanı sırasında herhangi bir anda değişebilir .
Basil Bourque

3

Aslında basit. Bir gün 86400000 miliSaniye içerir. Bu yüzden ilk önce geçerli saati System.currentTimeMillis()Milis'te Sistem'den alıp 84000000 miliSaniye ekleyin veDate ve Milisaniye için A tarih biçimi oluşturmak Sınıfı kullanın.

Misal

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

Dize Bugün 2019-05-9 olacak

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

String Tommorow 2019-05-10 olacak

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

String DayAfterTommorow 2019-05-11 olacak


Bu kod, Dateyıllar önce modern java.time sınıflarının yerini alan korkunç sınıfı kullanır . Kullanımı çok daha basit:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Basil Bourque

2

Kullanım durumunu açıklığa kavuşturalım: Takvim aritmetiği yapmak ve bir java.util ile başlangıç ​​/ bitiş yapmak istiyorsunuz. .

Bazı yaklaşımlar:

  1. SimpleDateFormat ile dizeye ve arkaya dönüştürme : Bu verimsiz bir çözümdür.
  2. LocalDate'e Dönüştür : Gün içinde herhangi bir saati kaybedersiniz.
  3. LocalDateTime'a Dönüştür : Bu daha fazla adım içerir ve saat dilimi hakkında endişelenmeniz gerekir.
  4. Date.getTime () ile çağa dönüştürme : Bu etkilidir, ancak milisaniye ile hesaplıyorsunuz.

Kullanmayı düşünün java.time.Instant :

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

1
Asla gibi korkunç eski sınıfları Datemodern java.time sınıflarıyla karıştırmayın Instant. Java.time sınıfları tamamen eski sınıfları yerini. Özellikle, Instantyerini alır java.util.Date.
Basil Bourque

1
Soruyu ele almıyor. Bir anı temsil eden sınıflar kullanıyorsunuz (bir ofset veya bölge bağlamında günün saati olan bir tarih). Ancak Soru, yalnızca günün saati ve saat dilimi olmadan soruyor. Bkz doğru cevap Sobral tarafından ve doğru cevap micha tarafından.
Basil Bourque

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

14
fyi, Date.setDate () kullanımdan kaldırıldı
Kelly S. French

Bilgisayarımda bir ay boyunca çalışıyor gibi görünüyor. Sonra Sun Apr 30 16:25:33 CEST 2017gelir Mon May 01 16:25:33 CEST 2017. Yine de cesareti kırılmış bir çözüm. Yöntem sadece iyi bir nedenden dolayı kullanılmıyor, 2017'de de Datesınıfa çok iyi alternatiflerimiz var .
Ole VV
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.