Saya ingin program Java yang menghitung hari antara dua tanggal.
- Ketik tanggal pertama (notasi Jerman; dengan spasi putih: "dd mm yyyy")
- Ketikkan tanggal kedua.
- Program harus menghitung jumlah hari antara dua tanggal.
Bagaimana saya bisa memasukkan tahun kabisat dan musim panas?
Kode saya:
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class NewDateDifference {
public static void main(String[] args) {
System.out.print("Insert first date: ");
Scanner s = new Scanner(System.in);
String[] eingabe1 = new String[3];
while (s.hasNext()) {
int i = 0;
insert1[i] = s.next();
if (!s.hasNext()) {
s.close();
break;
}
i++;
}
System.out.print("Insert second date: ");
Scanner t = new Scanner(System.in);
String[] insert2 = new String[3];
while (t.hasNext()) {
int i = 0;
insert2[i] = t.next();
if (!t.hasNext()) {
t.close();
break;
}
i++;
}
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert1[0]));
cal.set(Calendar.MONTH, Integer.parseInt(insert1[1]));
cal.set(Calendar.YEAR, Integer.parseInt(insert1[2]));
Date firstDate = cal.getTime();
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert2[0]));
cal.set(Calendar.MONTH, Integer.parseInt(insert2[1]));
cal.set(Calendar.YEAR, Integer.parseInt(insert2[2]));
Date secondDate = cal.getTime();
long diff = secondDate.getTime() - firstDate.getTime();
System.out.println ("Days: " + diff / 1000 / 60 / 60 / 24);
}
}
java
date-arithmetic
pengguna3025448
sumber
sumber
mm
danMM
: PJawaban:
UPDATE: Jawaban asli dari 2013 sekarang sudah usang karena beberapa kelas telah diganti. Cara baru untuk melakukan ini adalah menggunakan
java.time
kelas - kelas baru .Perhatikan bahwa solusi ini akan memberikan jumlah aktual 24 jam sehari, bukan jumlah hari kalender. Untuk yang terakhir, gunakan
Jawaban asli (kedaluwarsa pada Java 8)
Anda membuat beberapa konversi dengan String Anda yang tidak perlu. Ada
SimpleDateFormat
kelas untuk itu - coba ini:EDIT: Karena telah ada beberapa diskusi mengenai kebenaran kode ini: itu memang menangani tahun kabisat. Namun,
TimeUnit.DAYS.convert
fungsi kehilangan presisi karena milidetik dikonversi menjadi hari (lihat dokumen terkait untuk info lebih lanjut). Jika ini masalah,diff
bisa juga dikonversi dengan tangan:Perhatikan bahwa ini adalah
float
nilai, tidak harus berupaint
.sumber
String inputString1 = "28 2 2016"; String inputString2 = "1 3 2016";
: 2Cara termudah:
sumber
getDifferenceDays(11PM, 4 AM nextday) == 0
Di Java 8, Anda bisa melakukannya dengan menggunakan
LocalDate
danDateTimeFormatter
. Dari Javadoc dariLocalDate
:Dan polanya dapat dibangun menggunakan
DateTimeFormatter
. Inilah Javadoc , dan karakter pola yang relevan yang saya gunakan:Berikut ini contohnya:
Contoh input / output dengan yang terbaru terbaru:
Dengan yang lebih baru dulu:
Nah, Anda bisa melakukannya sebagai metode dengan cara yang lebih sederhana:
sumber
Sebagian besar / semua jawaban menyebabkan masalah bagi kami ketika waktu musim panas tiba. Inilah solusi kerja kami untuk semua tanggal, tanpa menggunakan JodaTime. Ini menggunakan objek kalender:
sumber
Calendar dayOne = (Calendar) day1.clone(), dayTwo = (Calendar) day2.clone();
garis karena mereka memastikan bahwa nilai kalender asli tidak diganti. Saya menghapus garis-garis ini menganggapnya berlebihan dan menghabiskan satu jam karena fakta bahwa nilai-nilai objek asli saya ditimpa dari dalam fungsi ini.Cara terbaik, dan itu dikonversi ke String sebagai bonus;)
sumber
Menggunakan:
sumber
Pustaka tanggal Java terkenal rusak. Saya akan menyarankan untuk menggunakan Joda Time . Ini akan menangani tahun kabisat, zona waktu dan sebagainya untuk Anda.
Contoh kerja minimal:
sumber
withZone( DateTimeZone.forID( "Europe/Berlin" ) )
. (B) Mengapa digunakanLocalDate
dalamdaysBetween
panggilan? Cukup lewati objek DateTime (firstTime, secondTime). Untuk hari penuh, teleponlahwithTimeAtStartOfDays
. (C) Saya akan menggunakan nama variabelfirstDateTime
daripadafirstTime
untuk menghindari ambiguitas antara objek tanggal, waktu, dan tanggal-waktu. (d) Tambahkan beberapa try-catch untuk menangani input data buruk yang tidak sesuai dengan format yang kami harapkan.sumber
Ketika saya menjalankan program Anda, itu bahkan tidak sampai ke titik di mana saya dapat memasukkan tanggal kedua.
Ini lebih sederhana dan lebih rentan kesalahan.
sumber
sumber
sumber