Bagaimana saya bisa menambah tanggal satu hari di Jawa?


562

Aku bekerja dengan tanggal dalam format ini: yyyy-mm-dd.

Bagaimana saya bisa meningkatkan tanggal ini satu hari?


10
Jika Anda menggunakan Java 8 atau yang lebih baru, Anda dapat menggunakan api tanggal / waktu yang baru. Lihat jawaban ini: stackoverflow.com/a/23910924/1115554
micha

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

Jawaban:


686

Sesuatu seperti ini harus melakukan trik:

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) tidak akan menggulung bulan pada hari terakhir bulan itu.
Sam Hasler

18
@Ammar itu ide yang buruk jika Anda tidak mengerti apa
niccolo m.

13
Saya akan mengutip beberapa JavaDocs ... Calendar.DATE: "... Ini adalah sinonim untuk DAY_OF_MONTH." Saya berharap JavaDocs akan menjelaskan bahwa ini akan menambah bidang yang lebih besar (seperti bulan dan tahun). Calendar.roll "Menambahkan atau mengurangi (atas / bawah) satu unit waktu pada bidang waktu yang diberikan tanpa mengubah bidang yang lebih besar" .. Sekali lagi, "bidang yang lebih besar" tidak jelas tetapi tampaknya konsisten dengan komentar Sam. Saya berharap ada StackOverflow untuk memperbaiki JavaDocs lama.
jcalfee314

4
teman-teman, sayangnya, tidak ada gunanya menambahkan hari menggunakan DATE, DAY_OF_MONTH atau bahkan DAY_OF_YEAR - semuanya bertambah dengan modulus. Jadi mengingat Kalender 31-12-1970, tambahkan (DAY_OF_YEAR, 1) atau roll (), namun roll () akhirnya panggilan add (), akan memberikan 01-01-1970. Saya kira satu-satunya cara yang benar adalah mengatur waktu dengan milidetik. Sedangkan saya, saya tidak pernah menggunakan kelas Kalender lagi.
Dmitry Gryazin

14
@Bagzerg: Anda salah . add()akan menggulung tanggal. Lihat di ideone .
Jean Hominal

212

Java tampaknya jauh di belakang bola delapan dibandingkan dengan C #. Metode utilitas ini menunjukkan cara melakukannya di Java SE 6 menggunakan metode Calendar.add (mungkin satu-satunya cara mudah).

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

Untuk menambahkan satu hari, per pertanyaan yang diajukan, sebut sebagai berikut:

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

4
FYI, sangat merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .
Basil Bourque

80

waktu java

Pada Java 8 dan yang lebih baru, paket java.time membuat ini cukup otomatis. ( Tutorial )

Dengan asumsi Stringinput dan output:

import java.time.LocalDate;

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

3
FYI, keduanya ZonedDateDateTimedan OffsetDateTimejuga memiliki plusDaysdan minusDaysmetode sertaLocalDate
Basil Bourque

@ BasilBourque Tentu, tetapi informasi yang tersedia dalam pertanyaan adalah dari LocalDate.
Daniel C. Sobral

2
@DanielCSobral Yap. Hanya menambahkan tautan untuk peneguhan pembaca Anda. Bukan kritik.
Basil Bourque

65

Saya lebih suka menggunakan DateUtils dari Apache. Lihatlah http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html . Ini berguna terutama ketika Anda harus menggunakannya di banyak tempat di proyek Anda dan tidak ingin menulis metode satu liner untuk ini.

API mengatakan:

addDays (Tanggal tanggal, jumlah int): Menambahkan beberapa hari ke tanggal mengembalikan objek baru.

Perhatikan bahwa ia mengembalikan objek Date baru dan tidak membuat perubahan ke objek sebelumnya itu sendiri.


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

48

Bangun objek Kalender dan gunakan metode add (Calendar.DATE, 1);


43

Lihatlah 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
Anda dapat menghapus panggilan parser untuk membangun DateTime. Gunakan DateTime date = DateTime baru (dateString); Kemudian, nextDay adalah ISODateTimeFormat.date (). Print (date.plusDays (1)); Lihat joda-time.sourceforge.net/api-release/org/joda/time/… untuk info lebih lanjut.
MetroidFan2002

Untuk contoh kode lebih rinci menggunakan Joda-Time, lihat jawaban saya untuk pertanyaan serupa, Bagaimana cara menambahkan satu hari ke tanggal? .
Basil Bourque

2
FYI ... Proyek Joda-Time sekarang dalam mode pemeliharaan, dan menyarankan migrasi ke kelas java.time . Kedua upaya itu dipimpin oleh orang yang sama, Stephen Colebourne. Jadi mereka berbagi konsep yang sama, dan migrasi tidak sulit.
Basil Bourque

40

Harap perhatikan bahwa baris ini menambahkan 24 jam:

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

tetapi baris ini menambahkan satu hari

cal.add( Calendar.DATE, 1 );

Pada hari dengan perubahan waktu musim panas (25 atau 23 jam), Anda akan mendapatkan hasil yang berbeda!


40

Java 8 menambahkan API baru untuk bekerja dengan tanggal dan waktu.

Dengan Java 8 Anda dapat menggunakan baris kode berikut:

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

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

1
Saya kira Anda januaryFirst.plusDays(1)tidak bermaksud demikian date.plusDays(1).
TeWu


1
@ Subho Untuk Android sebelum 26, lihat proyek ThreeTenABP yang mengadaptasi proyek ThreeTen-Backport , sebuah port-belakang jika sebagian besar fungsi waktu java ke Java 6 dan Java 7.
Basil Bourque

29

Anda dapat menggunakan lib java.util sederhana

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

1
Jawaban ini menggandakan konten dari beberapa Jawaban termasuk Jawaban yang diterima dari tiga tahun yang lalu. Hapus Jawaban Anda atau edit untuk menambah nilai.
Basil Bourque

3
jawaban ini lebih bersih, tidak mem-parsing tanggal di tengah. "jawaban yang diterima" terlalu berbelit-belit. ada baiknya Anda menambahkan milik Anda, abaikan ucapan otomatis basil
Mickey Perlstein

FYI, sangat merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .
Basil Bourque

Jawaban terbaik, langsung pada intinya. Saya setuju dengan Mickey, abaikan saja komentar basil
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);

Ini akan memberi tanggal besok. c.add(...)parameter dapat diubah dari 1 ke nomor lain untuk kenaikan yang sesuai.


1
Anda dapat melakukan sesuatu seperti c.setTime (objek Tanggal) untuk menetapkan Tanggal tertentu sebelum menambahkan.
Linh Lino

Saya berharap paket-paket java default akan membuat penanganan tanggal tidak berbelit-belit ... Maksud saya itu
menyebalkan

1
@Shn_Android_Dev Kelas java.time dibangun ke dalam Java 8 dan kemudian menggantikan kelas tanggal-waktu lama yang mengerikan, dan menjawab keinginan Anda. Juga porting kembali ke Java 6/7 & Android sebelumnya dalam proyek ThreeTen-Backport dan ThreeTenABP . Tidak perlu pernah digunakan Dateatau Calendarlagi.
Basil Bourque

19

Jika Anda menggunakan Java 8 , maka lakukan seperti ini.

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

Jika Anda ingin menggunakan SimpleDateFormat , maka lakukan seperti ini.

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

Tidak, Pertanyaan meminta nilai tanggal saja dan bukan tanggal. Jadi gunakan LocalDatekelas bukan LocalDateTime.
Basil Bourque

1
Jawaban Anda mengulangi isi setidaknya empat Jawaban lainnya. Tolong jelaskan bagaimana Anda menambahkan nilai di luar itu, atau menghapus sebelum Anda mengumpulkan suara.
Basil Bourque

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

Ini mengambil jumlah milidetik sejak zaman dari oldDate dan menambahkan 1 hari milidetik kemudian menggunakan konstruktor publik Date () untuk membuat tanggal menggunakan nilai baru. Metode ini memungkinkan Anda untuk menambah 1 hari, atau sejumlah jam / menit, tidak hanya sepanjang hari.


Ini mungkin bukan yang diinginkan OP; itu tidak membuat penyesuaian untuk penyesuaian jenis Daylight Savings, lompatan detik dan sebagainya.
mrec

1
Penghematan siang hari harus ditangani oleh zona waktu / lokal. Contoh saya menunjukkan peningkatan dengan durasi kecil. Ketika bertambah berdasarkan hari, kabisat detik bisa menjadi masalah tetapi saat menambahkan jam, itu lebih kecil kemungkinannya meskipun masih mungkin.
dvaey

15

Sejak Java 1.5 TimeUnit.DAYS.toMillis (1) terlihat lebih bersih bagi saya.

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

Ini menciptakan nilai tanggal-waktu di mana Pertanyaan meminta tanggal saja. Saya menyarankan pendekatan yang lebih bijaksana adalah LocalDatekelas di java.time kelas untuk Java 8 dan kemudian, dan back-port ke Java 6 & Java 7 ditemukan dalam proyek ThreeTen-Backport .
Basil Bourque


11

Di java 8 Anda bisa menggunakan 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

Anda dapat mengonversinya menjadi java.util.Dateobjek sebagai berikut.

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

Anda dapat memformat LocalDatemenjadi String sebagai berikut.

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

11

Ini sangat sederhana, berusaha menjelaskan dengan kata sederhana. dapatkan tanggal hari ini seperti di bawah ini

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

Sekarang atur satu hari ke depan dengan tanggal ini dengan metode calendar.add yang memakan waktu (konstan, nilai). Di sini konstanta dapat DATE, jam, min, detik dll dan nilai adalah nilai konstanta. Seperti untuk satu hari, konstanta ke depan adalah Calendar.DATE dan nilainya 1 karena kita ingin nilai satu hari ke depan.

System.out.println(calendar.getTime());// print modified date which is tanggal besok

Terima kasih



7

Masukkan tanggal dalam String dan jumlah hari berikutnya

 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

Jika Anda ingin menambahkan satu unit waktu dan Anda berharap bahwa bidang lain akan bertambah juga, Anda dapat menggunakan metode add dengan aman. Lihat contoh di bawah ini:

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

Akan Cetak:

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

Tidak ada jawaban yang diterima dan saya merasa ada kebingungan keseluruhan jika bidang lain juga diperbarui.
terrmith

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

4
Terima kasih telah mau berkontribusi. Namun ini sudah ada di beberapa jawaban lain, jadi saya benar-benar tidak melihat titik ... Selain itu IMHO tidak ada yang harus menggunakan kelas yang dirancang dengan buruk dan lama usang Calendarpada tahun 2019.
Ole VV

6

Jika Anda menggunakan Java SE 8 atau lebih tinggi Anda harus menggunakan Date / Time API baru

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

Jika Anda harus mengonversi dari java.util.Dateke java.time.LocalDate, Anda dapat menggunakan metode ini.

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

Jika Anda menggunakan versi sebelum Java SE 8, saya menyarankan Anda untuk menggunakan Joda-Time

Joda-Time menyediakan pengganti kualitas untuk kelas tanggal dan waktu Java dan merupakan perpustakaan tanggal dan waktu standar de facto untuk Java sebelum Java SE 8

   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
Pola Anda untuk java.timebagian ini salah. Itu harus dd/MM/uuuusetara dengan yang JodaTime.
TiiJ7

5

Gunakan DateFormatAPI untuk mengubah String menjadi objek Tanggal, lalu gunakan CalendarAPI untuk menambahkan satu hari. Beri tahu saya jika Anda ingin contoh kode tertentu, dan saya dapat memperbarui jawaban saya.


3

Jika Anda menggunakan Java 8, java.time.LocalDatedan java.time.format.DateTimeFormatterdapat membuat pekerjaan ini cukup sederhana.

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

Bahkan lebih sederhana: Jatuhkan formatter dan gunakan saja toString()untuk menghasilkan string i yyyy-MM-dd format (dan jika Anda bersikeras, ingat bahwa mmini adalah menit sementara MMadalah bulan).
Ole VV

3

Anda dapat menggunakan paket ini dari "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
Menyarankan Datekelas pada 2018 adalah saran yang buruk. Kelas tanggal-waktu lama merepotkan seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle . Lihat Jawaban lain menggunakan LocalDatekelas.
Basil Bourque

Ya itu, LocalDate ADALAH cara terbaik untuk melakukan itu,
Shaheed

namun beberapa kerangka kerja seperti jsf memiliki sedikit masalah integrasi dengan API waktu jadi terkadang Anda harus menggunakan Tanggal; plus java lingkungan <8
Lucke

1
@Lucke Sebagian besar fungsi java.time di -porting kembali ke Java 6 & 7 di proyek ThreeTen-Backport . Selanjutnya diadaptasi ke Android yang lebih tua dalam proyek ThreeTenABP . Jadi, benar-benar tidak perlu pernah menyentuh kelas-tanggal tua yang mengerikan itu. Banyak kerangka kerja telah diperbarui. Tapi tidak semua. Jadi jika Anda harus beroperasi dengan kode lama yang belum diperbarui ke java.time , tulis kode baru Anda di java.time dan konversikan ke / dari tipe lama dengan memanggil metode konversi baru yang ditambahkan ke kelas lama.
Basil Bourque

1
Kode ini mengabaikan masalah penting zona waktu . Untuk setiap saat, tanggal bervariasi di sekitar bola dunia menurut zona. The SimpleDateFormatkelas sayangnya menyuntikkan zona waktu, secara implisit menerapkan zona default JVM saat ini. Jadi hasil dari kode ini akan bervariasi tergantung pada apa pun default saat ini - dan standar itu dapat berubah setiap saat selama runtime.
Basil Bourque

3

Sederhana sebenarnya. Suatu hari mengandung 86400000 milidetik. Jadi pertama-tama Anda mendapatkan waktu saat ini dalam milidetik dari Sistem dengan menggunakan System.currentTimeMillis()kemudian tambahkan 84000000 milidetik dan menggunakan DateKelas untuk menghasilkan format tanggal untuk milidetik.

Contoh

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

String Today akan menjadi 2019-05-9

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

String Tommorow akan menjadi 2019-05-10

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

String DayAfterTommorow akan menjadi 2019-05-11


Kode ini menggunakan Datekelas mengerikan yang digantikan tahun yang lalu oleh kelas java.time modern . Jauh lebih sederhana untuk hanya menggunakan:LocalDate.parse( "2019-01-23" ).plusDays( 1 )
Basil Bourque

2

Mari kita perjelas kasus penggunaan: Anda ingin melakukan aritmatika kalender dan memulai / mengakhiri dengan java.util.Date .

Beberapa pendekatan:

  1. Konversikan ke string dan kembali dengan SimpleDateFormat : Ini adalah solusi yang tidak efisien.
  2. Konversikan ke LocalDate : Anda akan kehilangan informasi sepanjang hari.
  3. Konversikan ke LocalDateTime : Ini melibatkan lebih banyak langkah dan Anda perlu khawatir tentang zona waktu.
  4. Konversikan ke zaman dengan Date.getTime () : Ini efisien tetapi Anda menghitung dengan milidetik.

Pertimbangkan menggunakan java.time.Instant :

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

1
Jangan pernah mencampurkan kelas warisan yang mengerikan seperti Datedengan kelas java.time modern seperti Instant. The java.time kelas sepenuhnya menggantikan kelas warisan. Secara khusus, Instantdiganti java.util.Date.
Basil Bourque

1
Tidak menjawab Pertanyaan. Anda menggunakan kelas-kelas yang mewakili momen (tanggal dengan waktu dalam konteks offset atau zona). Tetapi Pertanyaan menanyakan tentang tanggal-saja tanpa waktu-hari dan tanpa zona waktu. Lihat Jawaban benar oleh Sobral dan Jawaban benar oleh micha.
Basil Bourque

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

14
fyi, Date.setDate () sudah tidak digunakan lagi
Kelly S. French

Di komputer saya sepertinya berfungsi melintasi batas bulan. Setelah Sun Apr 30 16:25:33 CEST 2017datang Mon May 01 16:25:33 CEST 2017. Ini masih merupakan solusi yang tidak dianjurkan. Metode ini tidak hanya ditinggalkan karena alasan yang baik, juga pada tahun 2017 kami memiliki alternatif yang sangat baik untuk Datekelas.
Ole VV
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.