Adakah yang tahu cara sederhana menggunakan kalender Java untuk mengurangi X hari dari tanggal?
Saya belum dapat menemukan fungsi yang memungkinkan saya untuk secara langsung mengurangi X hari dari tanggal di Jawa. Bisakah seseorang mengarahkan saya ke arah yang benar?
java
calendar
subtraction
fmsf
sumber
sumber
java.util.Calendar
sekarang warisan , digantikan oleh kelas java.time . Lihat Tutorial oleh Oracle .Jawaban:
Diambil dari dokumen di sini :
sumber
Calendar.DAY_OF_MONTH
dalam hal ini karena tidak akan menangani gulungan antara bulan seperti yang Anda inginkan. GunakanCalendar.DAY_OF_YEAR
sebaliknyaAnda dapat menggunakan
add
metode ini dan memberikannya angka negatif. Namun, Anda juga bisa menulis metode yang lebih sederhana yang tidak menggunakanCalendar
kelas seperti berikut iniIni 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":
Perhatikan bahwa kedua solusi ini mengubah
Date
objek yang dilewatkan sebagai parameter daripada mengembalikan yang sama sekali baruDate
. Salah satu fungsi dapat dengan mudah diubah untuk melakukannya dengan cara lain jika diinginkan.sumber
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
sumber
tl; dr
Lebih baik menentukan zona waktu.
Detail
Kelas tanggal-waktu lama yang dibundel dengan versi awal Java, seperti
java.util.Date
/.Calendar
, telah terbukti menyusahkan, membingungkan, dan cacat. Hindari mereka.waktu java
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".ZonedDateTime
Jika Anda bermaksud menentukan tanggal, maka gunakan
Instant
kelas untuk mendapatkan momen di timeline dalam UTC . Dari sana, sesuaikan ke zona waktu untuk mendapatkanZonedDateTime
objek.Tentang java.time
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 perlu
java.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 .sumber
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)
sumber
Daripada menulis sendiri
addDays
seperti yang disarankan oleh Eli, saya lebih suka menggunakanDateUtils
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.sumber
Hal ini dapat dilakukan dengan mudah dengan cara berikut
sumber
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:
Dan:
sumber
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:
Contoh lain untuk mengurangi 1 jam dan menambahkan 15 menit:
Jika Anda membutuhkan akurasi lebih, Instance mengukur hingga nanodetik. Metode memanipulasi bagian nanodetik:
Juga, ingatlah, Tanggal itu tidak seakurat Instan.
sumber
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
Solusi kedua Eli Courtwright salah, seharusnya:
sumber
addDays
; solusinya benar. Jika Anda ingin mengurangi hari dari tanggal, Anda memberikan nilai negatif untukdays
.