Saya ingin mendapatkan Tahun, Bulan, Hari, dll dari Tanggal Java untuk dibandingkan dengan tanggal Kalender Gregorian di Jawa. Apakah ini mungkin?

231

Saya memiliki objek Date di Java yang disimpan sebagai tipe Date Java.

Saya juga memiliki tanggal yang dibuat Kalender Gregorian. Tanggal kalender gregorian tidak memiliki parameter dan oleh karena itu merupakan turunan dari tanggal hari ini (dan waktu?).

Dengan tanggal java, saya ingin bisa mendapatkan tahun, bulan, hari, jam, menit, dan detik dari tipe tanggal java dan membandingkan tanggal kalender gregorian.

Saya melihat bahwa saat ini tanggal Java disimpan sebagai panjang dan satu-satunya metode yang tersedia tampaknya hanya menulis panjang sebagai string tanggal yang diformat. Apakah ada cara untuk mengakses Tahun, bulan, hari, dll?

Saya melihat bahwa getYear(), getMonth(), dll metode untuk Datekelas telah usang. Saya bertanya-tanya apa praktik terbaik untuk menggunakan contoh Java Date yang saya miliki dengan GregorianCalendartanggal.

Tujuan akhir saya adalah melakukan perhitungan tanggal sehingga saya dapat memeriksa bahwa tanggal Java berada dalam banyak jam, menit, dll dari tanggal dan waktu hari ini.

Saya masih pemula di Jawa dan saya agak bingung dengan ini.

daveb
sumber
1
Hai, apa pun yang Anda gunakan jangan gunakan Date.getYear(). Menderita masalah (yang saya tidak tahu). Date.getYear()pernah menguraikan tanggal saya 30/06/2017 dan mengembalikan tahun saya sebagai 117. Lihat di mana ia mendarat, dua ribu tahun yang lalu. Tetapi ketika saya mencetak hanya Obyek Tanggal, Output baik-baik saja. Tapi tidak Date.getYear();.
Seenivasan
FYI: Anda menggunakan kelas Date-time lama yang merepotkan yang sekarang merupakan warisan, digantikan oleh kelas java.time modern.
Basil Bourque

Jawaban:

545

Gunakan sesuatu seperti:

Date date; // your date
// Choose time zone in which you want to interpret your Date
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// etc.

Hati-hati, bulan dimulai dari 0, bukan 1.

Sunting : Karena Java 8 lebih baik menggunakan java.time.LocalDate daripada java.util.Calendar . Lihat jawaban ini untuk cara melakukannya.

Florent Guillaume
sumber
4
Anda dapat menggunakan cal.add(Calendar.DAY_OF_MONTH, -48)aritmatika hari pada objek Kalender. Dan Anda dapat membandingkan dua objek Kalender menggunakan cal.compareTo(anotherCal).
Florent Guillaume
1
Cemerlang, bersorak Florent! Apakah di atas berarti Kalender akan kembali diperbarui tahun dan hari, detik, menit, dan detik ketika metode mendapatkan kalender digunakan? Dave
daveb
11
Perhatikan bahwa bulan dimulai dengan 0 dan bukan 1 (yaitu Januari = 0). docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo
10
Mengapa JAVA sangat merepotkan?
Kimchi Man
3
Karena Tanggal dan Kalender sudah tua dan dirancang dengan buruk. Java 8 memiliki objek data / waktu yang jauh lebih baik, lihat oracle.com/technetwork/articles/java/…
Florent Guillaume
88

Dengan Java 8 dan yang lebih baru, Anda dapat mengonversi objek Tanggal ke a objek LocalDate dan kemudian dengan mudah mendapatkan tahun, bulan, dan hari.

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year  = localDate.getYear();
int month = localDate.getMonthValue();
int day   = localDate.getDayOfMonth();

Perhatikan bahwa getMonthValue()mengembalikan nilai int dari 1 hingga 12.

Ortomala Lokni
sumber
10
Sekarang adalah 2016, saya percaya menggunakan LocalDateJava 8 adalah solusi terbaik yang menghemat waktu Anda, solusi lain menggunakan Calendardan Datepenuh masalah.
AnnieFromTaiwan
2
Jawaban yang bagus - jelas terbaik untuk menggunakan java.time dan menghindari kelas-tanggal lama yang merepotkan. Juga, perhatikan bagaimana Jawaban ini dengan bijak membahas masalah zona waktu. Untuk setiap momen tertentu, tanggalnya bervariasi di seluruh dunia berdasarkan zona waktu.
Basil Bourque
1
Sayangnya API level 26+ untuk android.
Wiktor Kalinowski
14

Anda dapat melakukan sesuatu seperti ini, ini akan menjelaskan cara kerja Datekelas.

String currentDateString = "02/27/2012 17:00:00";
SimpleDateFormat sd = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentDate = sd.parse(currentDateString);

String yourDateString = "02/28/2012 15:00:00";
SimpleDateFormat yourDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date yourDate = yourDateFormat.parse(yourDateString);

if (yourDate.after(currentDate)) {
    System.out.println("After");
} else if(yourDate.equals(currentDate)) {
    System.out.println("Same");
} else {
    System.out.println("Before");
}
javaCity
sumber
Hai JavaCity, Terima kasih untuk ini. ini sangat berguna. Saat ini saya mencoba untuk menghindari parsing dari string tanggal. Saya akan perlu melakukan parsing ini nanti ketika saya meminta pengguna aplikasi saya untuk mengatur tahun, hari dan bulan. Saya akan membangun string untuk mengurai ke SimpleDateFormat. Di atas sangat berguna untuk melihat ini dalam tindakan. Tanggal Java saya dibuat sebagai tanggal dan waktu dari instantiasinya sehari yang lalu. Saya sekarang ingin membandingkan dengan tanggal kalender gregorian yang telah dipakai hari ini. Terima kasih yang tulus
daveb
8
Harap perbaiki kode ... huruf kecil mmmenunjukkan menit, huruf besar MMberarti bulan-tahun.
YoYo
12
    Date date = new Date();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");

    System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("MMMM");
    System.out.println("MONTH "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("YYYY");
    System.out.println("YEAR "+simpleDateFormat.format(date).toUpperCase());

EDIT: Output untuk date= Fri Jun 15 09:20:21 CEST 2018adalah:

DAY FRIDAY
MONTH JUNE
YEAR 2018
Az.MaYo
sumber
Jika Anda telah memasukkan setidaknya output, orang dapat memutuskan apakah ini mungkin bermanfaat bagi mereka atau tidak tanpa harus menjalankan kode.
SantiBailors
6
private boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
    boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
    return (sameDay && sameMonth && sameYear);
}
evya
sumber
3
    Date queueDate = new SimpleDateFormat("yyyy-MM-dd").parse(inputDtStr);
    Calendar queueDateCal = Calendar.getInstance();
    queueDateCal.setTime(queueDate);
    if(queueDateCal.get(Calendar.DAY_OF_YEAR)==Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
{
    "same day of the year!";
 }
Rabi
sumber
1
Jawaban tentang Stack Overflow diharapkan memiliki beberapa diskusi dan penjelasan, bukan hanya cuplikan kode. Dan kode Anda pasti bisa menggunakan beberapa penjelasan.
Basil Bourque
1
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
2
@Test
public void testDate() throws ParseException {
    long start = System.currentTimeMillis();
    long round = 100000l;
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay(new Date());
    }
    long mid = System.currentTimeMillis();
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay2(new Date());
    }
    long end = System.currentTimeMillis();
    System.out.println(mid - start);
    System.out.println(end - mid);
}

public static Date getYearMonthDay(Date date) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("yyyyyMMdd");
    String dateStr = f.format(date);
    return f.parse(dateStr);
}

public static Date getYearMonthDay2(Date date) throws ParseException {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.HOUR_OF_DAY, 0);
    return c.getTime();
}
public static int compare(Date today, Date future, Date past) {
    Date today1 = StringUtil.getYearMonthDay2(today);
    Date future1 = StringUtil.getYearMonthDay2(future);
    Date past1 = StringUtil.getYearMonthDay2(past);
    return today.compare // or today.after or today.before
}

getYearMonthDay2 (solusi kalender) sepuluh kali lebih cepat. Sekarang Anda sudah memiliki MM-00 00 00 00, dan kemudian membandingkan menggunakan date.compare

Tiina
sumber
2

Mungkin lebih mudah

     Date date1 = new Date("31-May-2017");
OR
    java.sql.Date date1 = new java.sql.Date((new Date()).getTime());

    SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
    SimpleDateFormat formatNowMonth = new SimpleDateFormat("MM");
    SimpleDateFormat formatNowYear = new SimpleDateFormat("YYYY");

    String currentDay = formatNowDay.format(date1);
    String currentMonth = formatNowMonth.format(date1);
    String currentYear = formatNowYear.format(date1);
Abdur Rahman
sumber
-2

Hati-hati mount mulai dari 0 bukan 1. Dan juga Kalender menggunakan pm seperti saya sehingga sangat hati-hati saat menggunakan Jam dan menit.

Date your_date;
Calendar cal = Calendar.getInstance(); 
cal.setTime(your_date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MINUTE);

harun ugur
sumber
1
Lebih baik menggunakan java.time modern yang menggantikan kelas warisan lama yang merepotkan yang ditunjukkan di sini. Lihat Jawaban yang benar
Basil Bourque
Terima kasih atas jawaban dan sarannya. Ini sangat baik.
harun ugur