Jawaban:
Diambil dari dokumen di sini :
Menambahkan atau mengurangi jumlah waktu yang ditentukan ke bidang kalender yang diberikan, berdasarkan aturan kalender. Misalnya, untuk mengurangi 5 hari dari waktu kalender saat ini, Anda dapat mencapainya dengan menelepon:
Calendar calendar = Calendar.getInstance(); // this would default to now calendar.add(Calendar.DAY_OF_MONTH, -5).
Calendar.DAY_OF_MONTHdalam hal ini karena tidak akan menangani gulungan antara bulan seperti yang Anda inginkan. Gunakan Calendar.DAY_OF_YEARsebaliknya
Anda dapat menggunakan addmetode ini dan memberikannya angka negatif. Namun, Anda juga bisa menulis metode yang lebih sederhana yang tidak menggunakan Calendarkelas seperti berikut ini
public static void addDays(Date d, int days)
{
d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}
Ini mendapatkan nilai cap waktu tanggal (milidetik sejak zaman) dan menambahkan jumlah milidetik yang tepat. Anda bisa melewati bilangan bulat negatif untuk parameter hari untuk melakukan pengurangan. Ini akan lebih sederhana daripada solusi kalender yang "tepat":
public static void addDays(Date d, int days)
{
Calendar c = Calendar.getInstance();
c.setTime(d);
c.add(Calendar.DATE, days);
d.setTime( c.getTime().getTime() );
}
Perhatikan bahwa kedua solusi ini mengubah Dateobjek yang dilewatkan sebagai parameter daripada mengembalikan yang sama sekali baru Date. Salah satu fungsi dapat dengan mudah diubah untuk melakukannya dengan cara lain jika diinginkan.
java.util.Calendarsekarang warisan , digantikan oleh kelas java.time . Lihat Tutorial oleh Oracle .
Jawaban Anson akan bekerja dengan baik untuk kasus sederhana, tetapi jika Anda akan melakukan perhitungan tanggal yang lebih kompleks saya akan merekomendasikan memeriksa Joda Time . Itu akan membuat hidup Anda lebih mudah.
FYI di Joda Time bisa Anda lakukan
DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
LocalDate.now().minusDays( 10 )
Lebih baik menentukan zona waktu.
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
Kelas tanggal-waktu lama yang dibundel dengan versi awal Java, seperti java.util.Date/.Calendar , telah terbukti menyusahkan, membingungkan, dan cacat. Hindari mereka.
Java 8 dan yang lebih baru menggantikan kelas-kelas lama dengan kerangka kerja java.time baru. Lihat Tutorial . Didefinisikan oleh JSR 310 , terinspirasi oleh Joda-Time , dan diperpanjang oleh ThreeTen-Extra . Proyek ThreeTen-Backport mendukung kelas-kelas ke Java 6 & 7; proyek ThreeTenABP ke Android.
Pertanyaannya tidak jelas, tidak jelas apakah hanya meminta tanggal saja atau tanggal saja.
LocalDateUntuk kencan saja, tanpa waktu, gunakan LocalDatekelas. Perhatikan bahwa zona waktu sangat penting dalam menentukan tanggal seperti "hari ini".
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );
ZonedDateTimeJika Anda bermaksud menentukan tanggal, maka gunakan Instantkelas untuk mendapatkan momen di timeline dalam UTC . Dari sana, sesuaikan ke zona waktu untuk mendapatkan ZonedDateTimeobjek.
Instant now = Instant.now(); // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date, Calendar, & SimpleDateFormat.
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .
Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlujava.sql.* kelas.
Di mana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);
sunting: pengurai sepertinya tidak menyukai tautan ke Javadoc, jadi di sini ada di plaintext:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
Daripada menulis sendiri addDaysseperti yang disarankan oleh Eli, saya lebih suka menggunakan DateUtilsdari Apache . Ini berguna terutama ketika Anda harus menggunakannya di banyak tempat di proyek Anda.
API mengatakan:
addDays(Date date, int amount)
Menambahkan beberapa hari ke tanggal mengembalikan objek baru.
Perhatikan bahwa ia mengembalikan yang baru Date objek dan tidak membuat perubahan ke yang sebelumnya itu sendiri.
Hal ini dapat dilakukan dengan mudah dengan cara berikut
Calendar calendar = Calendar.getInstance();
// from current time
long curTimeInMills = new Date().getTime();
long timeInMills = curTimeInMills - 5 * (24*60*60*1000); // `enter code here`subtract like 5 days
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
// from specific time like (08 05 2015)
calendar.set(Calendar.DAY_OF_MONTH, 8);
calendar.set(Calendar.MONTH, (5-1));
calendar.set(Calendar.YEAR, 2015);
timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
LocalDatejauh lebih sederhana dan lebih tepat.
Seseorang merekomendasikan Joda Time jadi - Saya telah menggunakan kelas CalendarDate ini http://calendardate.sourceforge.net
Ini adalah proyek yang agak bersaing untuk Joda Time, tetapi jauh lebih mendasar di hanya 2 kelas. Ini sangat berguna dan bekerja sangat baik untuk apa yang saya butuhkan karena saya tidak ingin menggunakan paket yang lebih besar dari proyek saya. Tidak seperti rekan-rekan Java, unit terkecilnya adalah hari jadi itu benar-benar tanggal (tidak harus turun ke milidetik atau sesuatu). Setelah Anda membuat tanggal, yang Anda lakukan untuk mengurangi adalah sesuatu seperti myDay.addDays (-5) untuk kembali 5 hari. Anda dapat menggunakannya untuk menemukan hari dalam seminggu dan hal-hal seperti itu. Contoh lain:
CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);
Dan:
//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
dayLabel = cdf.format(currDay);
if (currDay.equals(today))
dayLabel = "Today";//print "Today" instead of the weekday name
System.out.println(dayLabel);
currDay = currDay.addDays(1);//go to next day
}
Saya percaya cara yang bersih dan menyenangkan untuk melakukan pengurangan atau penambahan unit waktu (bulan, hari, jam, menit, detik, ...) dapat dicapai dengan menggunakan kelas java.time.Instant .
Contoh untuk mengurangi 5 hari dari waktu sekarang dan mendapatkan hasilnya sebagai Tanggal:
new Date(Instant.now().minus(5, ChronoUnit.DAYS).toEpochMilli());
Contoh lain untuk mengurangi 1 jam dan menambahkan 15 menit:
Date.from(Instant.now().minus(Duration.ofHours(1)).plus(Duration.ofMinutes(15)));
Jika Anda membutuhkan akurasi lebih, Instance mengukur hingga nanodetik. Metode memanipulasi bagian nanodetik:
minusNano()
plusNano()
getNano()
Juga, ingatlah, Tanggal itu tidak seakurat Instan.
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
Solusi kedua Eli Courtwright salah, seharusnya:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
addDays; solusinya benar. Jika Anda ingin mengurangi hari dari tanggal, Anda memberikan nilai negatif untuk days.
java.util.Calendarsekarang warisan , digantikan oleh kelas java.time . Lihat Tutorial oleh Oracle .