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_MONTH
dalam hal ini karena tidak akan menangani gulungan antara bulan seperti yang Anda inginkan. Gunakan Calendar.DAY_OF_YEAR
sebaliknya
Anda dapat menggunakan add
metode ini dan memberikannya angka negatif. Namun, Anda juga bisa menulis metode yang lebih sederhana yang tidak menggunakan Calendar
kelas 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 Date
objek 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.Calendar
sekarang 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.
LocalDate
Untuk kencan saja, tanpa waktu, gunakan LocalDate
kelas. 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 );
ZonedDateTime
Jika Anda bermaksud menentukan tanggal, maka gunakan Instant
kelas untuk mendapatkan momen di timeline dalam UTC . Dari sana, sesuaikan ke zona waktu untuk mendapatkan ZonedDateTime
objek.
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 addDays
seperti yang disarankan oleh Eli, saya lebih suka menggunakan DateUtils
dari 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());
LocalDate
jauh 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.Calendar
sekarang warisan , digantikan oleh kelas java.time . Lihat Tutorial oleh Oracle .