Java'daki Gregoryen Takvim tarihiyle karşılaştırmak için Java Tarihinden Yıl, Ay, Gün vb. Almak istiyorum. Mümkün mü?


231

Java'da Java'nın Tarih türü olarak depolanan bir Date nesnesi var.

Ayrıca bir Gregoryen Takvimi oluşturdum. Gregoryen takvim tarihinin parametresi yoktur ve bu nedenle bugünün tarihinin (ve saatinin) bir örneğidir.

Java tarihi ile, java tarih türünden yıl, ay, gün, saat, dakika ve saniye almak ve gregoriancalendar tarihini karşılaştırmak istiyorum.

Java tarihinin uzun bir süre saklandığını ve mevcut tek yöntemlerin sadece biçimlendirilmiş bir tarih dizesi kadar uzun yazdığını gördüm. Yıl, ay, gün vb. Erişmenin bir yolu var mı?

Bunu gördüm getYear(), getMonth()için, vb yöntemler Datesınıfın kullanımdan kaldırıldı. Tarihte sahip olduğum Java Date örneğini kullanmak için en iyi uygulamanın ne olduğunu merak ediyordum GregorianCalendar.

Son hedefim bir tarih hesaplaması yapmak, böylece Java tarihinin bugünün tarih ve saatinin çok saat, dakika vb. İçinde olduğunu kontrol edebiliyorum.

Hala Java'ya yeniyim ve bundan biraz şaşkına dönüyorum.


1
Hey ne kullanırsan kullan Date.getYear(), bu sorunlardan muzdarip (bilmiyorum). Date.getYear()bir kez 30/06/2017 tarihimi ayrıştırdı ve yıl 117 olarak döndü. İki bin yıl önce nereye indi bakın. Ama basitçe Tarih Nesnesi yazdırdığınızda, Çıktı iyiydi.Ama değil Date.getYear();.
Seenivasan

Bilginize: Modern java.time sınıflarıyla desteklenen, artık eski olan zahmetli eski Date-time sınıfları kullanıyorsunuz.
Basil Bourque

Yanıtlar:


545

Şunun gibi bir şey kullanın:

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.

Dikkat edin, aylar 0'da başlar, 1 değil.

Düzenleme : Java 8 beri java.util.Calendar yerine java.time.LocalDate kullanmak daha iyidir . Nasıl yapılacağı için bu cevaba bakınız .


4
cal.add(Calendar.DAY_OF_MONTH, -48)Takvim nesnelerinde gün aritmetiği yapmak için kullanabilirsiniz . Ve kullanarak iki Takvim nesnesini karşılaştırabilirsiniz cal.compareTo(anotherCal).
Florent Guillaume

1
Harika, şerefe Florent! Yukarıdaki, Takvim alma yöntemleri kullanıldığında Takvim'in yıl ve gün, saniye, dakika ve saniye olarak güncelleneceği anlamına mı geliyor? Dave
daveb

11
Ayın 1 değil, 0 ile başladığını unutmayın (örn. Ocak = 0). docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo

10
JAVA neden bu kadar rahatsız edici?
Kimchi Man

3
Çünkü Tarih ve Takvim eski ve kötü tasarlanmış. Java 8'in çok daha iyi veri / zaman nesneleri var, bkz. Oracle.com/technetwork/articles/java/…
Florent Guillaume

88

Java 8 ve üstü ile Date nesnesini LocalDate nesnesine dönüştürebilir ve ardından yıl, ay ve günü kolayca alabilirsiniz.

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

Not getMonthValue()1 ile 12 arasında bir int değerini verir.


10
Şimdi 2016, LocalDateJava 8'de kullanmanın zaman kazandıracak en iyi çözüm olduğuna inanıyorum , başka bir çözüm kullanıyor Calendarve Datesorunla dolu.
AnnieFromTaiwan

2
Harika cevap - java.time kullanmak ve zahmetli eski tarih-saat sınıflarından kaçınmak kesinlikle en iyisidir . Ayrıca, bu Yanıtın saat dilimi konusunu akıllıca nasıl ele aldığına dikkat edin. Belirli bir an için, tarih tüm dünyada saat dilimine göre değişir.
Basil Bourque

1
Ne yazık ki android için API seviyesi 26+.
Wiktor Kalinowski

14

Böyle bir şey yapabilirsiniz, Datesınıfın nasıl çalıştığını açıklayacaktır .

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");
}

Merhaba JavaCity, Bunun için teşekkürler. bu çok faydalı. Şu anda bir tarih dizesinden ayrışmaktan kaçınmaya çalışıyorum. Bu ayrıştırma işlemini daha sonra yapmam gerekecek ancak uygulamamın kullanıcılarını yıl, gün ve ay olarak ayarladığımda. SimpleDateFormat içine ayrıştırmak için bir dize inşa edecekti. Yukarıdakiler bunu çalışırken görmek için çok yararlıdır. Java tarihim, bir gün önce gerçekleştirilmesinden itibaren tarih ve saat olarak oluşturuldu. Şimdi bugün somutlaştırılan gregoriancalendar tarihi ile karşılaştırmak istiyorum. Teşekkürlerimi
daveb

8
Lütfen kodu düzeltin ... küçük harf mmdakikaları gösterir, büyük harf MMyıl ayı anlamına gelir.
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: date= için çıktı Fri Jun 15 09:20:21 CEST 2018:

DAY FRIDAY
MONTH JUNE
YEAR 2018

En azından çıktıyı koymuş olsaydınız, insanlar kodu çalıştırmak zorunda kalmadan bunun kendileri için yararlı olup olmayacağına karar verebilirler.
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);
}

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!";
 }

1
Yığın Taşması ile ilgili yanıtların yalnızca kod parçacıklarını değil, bazı tartışma ve açıklamaları olması beklenir. Ve kodunuz kesinlikle bir açıklama kullanabilir.
Basil Bourque

1
Bilginize gibi korkunç zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
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 (takvim çözümü) on kat daha hızlıdır. Şimdi yyyy AA dd 00 00 00 var ve sonra date.compare kullanarak karşılaştırın.


2

Daha kolay olabilir

     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);

-2

Dikkatli olun 0 değil 1 başlangıç ​​başlar. Ve aynı zamanda Takvim am am gibi kullanın, böylece Saat ans dakika kullanırken çok dikkatli olun.

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


1
Burada gösterilen bu sıkıntılı eski miras sınıflarını tamamlayan modern java.time'ı kullanmak daha iyidir. Doğru Cevabı
Basil Bourque

Yanıt ve öneriniz için teşekkür ederiz. Çok daha iyi.
harun ugur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.