Java에서 Gregorian Calendar 날짜와 비교하기 위해 Java Date에서 Year, Month, Day 등을 가져오고 싶습니다. 이게 가능해?


231

Java의 Date 객체로 Java의 Date 객체가 저장되어 있습니다.

또한 Gregorian Calendar 작성 날짜가 있습니다. gregorian calendar 날짜에는 매개 변수가 없으므로 오늘 날짜 (및 시간?)의 인스턴스입니다.

Java 날짜를 사용하면 Java 날짜 유형에서 년, 월, 일,시, 분 및 초를 가져 와서 gregoriancalendar 날짜를 비교할 수 있기를 원합니다.

나는 현재 Java 날짜가 long으로 저장되어 있으며 사용할 수있는 유일한 방법은 long을 형식이 지정된 날짜 문자열로 쓰는 것 같습니다. 년, 월, 일 등에 액세스 할 수있는 방법이 있습니까?

나는 것을보고 getYear(), getMonth()위해 등의 방법 Date클래스가 사용되지 않습니다. 날짜와 함께 Java Date 인스턴스를 사용하는 가장 좋은 방법이 무엇인지 궁금 GregorianCalendar합니다.

내 최종 목표는 날짜 계산을 수행하여 Java 날짜가 오늘 날짜 및 시간의 너무 많은 시간, 분 등 내에 있는지 확인할 수 있습니다.

나는 여전히 Java의 초보자이며 이것에 약간 당황하고 있습니다.


1
이봐, 당신이 사용하는 것은 사용하지 않습니다 Date.getYear(). 문제가 있습니다 (모름). Date.getYear()한 번은 내 날짜를 2017 년 6 월 30 일 구문 분석하고 내 년을 117로 반환했습니다. 그러나 단순히 Date Object를 인쇄하면 Output은 Fine Date.getYear();입니다. 그러나 아닙니다 .
Seenivasan 2016 년

참고 : 현대 java.time 클래스로 대체 된 기존의 번거로운 Date-time 클래스를 사용하고 있습니다.
Basil Bourque

답변:


545

다음과 같은 것을 사용하십시오 :

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.

개월은 1이 아니라 0에서 시작합니다.

편집 : Java 8부터 java.util.Calendar 대신 java.time.LocalDate 를 사용 하는 것이 좋습니다 . 방법에 대해서는 이 답변 을 참조하십시오 .


4
cal.add(Calendar.DAY_OF_MONTH, -48)Calendar 객체에서 하루 산술을 수행 하는 데 사용할 수 있습니다 . 를 사용하여 두 개의 Calendar 객체를 비교할 수 있습니다 cal.compareTo(anotherCal).
Florent Guillaume

1
화려하고 건배 플로렌스! 위의 사항은 캘린더 get 메소드가 사용될 때 캘린더가 업데이트 된 연도, 일, 초, 분 및 초를 리턴한다는 것을 의미합니까? Dave
daveb

11
월은 1이 아닌 0으로 시작합니다 (예 : 1 월 = 0). docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo

10
왜 JAVA가 불편한가요?
Kimchi Man

3
날짜와 달력이 오래되고 잘못 설계 되었기 때문입니다. Java 8은 데이터 / 시간 객체가 훨씬 우수합니다. oracle.com/technetwork/articles/java/…를
Florent Guillaume

88

Java 8 이상에서는 Date 객체를 LocalDate 객체 로 변환 한 다음 연도, 월, 일을 쉽게 얻을 수 있습니다.

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

getMonthValue()1에서 12 사이의 int 값 을 반환합니다.


10
지금은 2016입니다, 내가 사용 믿습니다 LocalDate자바 8은 다른 솔루션을 사용하여 시간을 절약 할 최적의 솔루션 CalendarDate문제가 가득합니다.
AnnieFromTaiwan

2
좋은 답변 -java.time 을 사용 하고 번거로운 오래된 날짜 시간 클래스를 피하는 것이 가장 좋습니다 . 또한이 답변이 표준 시간대 문제를 어떻게 현명하게 해결하는지 살펴보십시오. 주어진 순간마다 날짜는 시간대에 따라 다릅니다.
Basil Bourque 1

1
안타깝게도 Android 용 API 레벨 26 이상.
Wiktor Kalinowski

14

이런 식으로 Date수업이 어떻게 진행되는지 설명 할 수 있습니다.

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, 감사합니다. 이것은 매우 유용합니다. 현재 날짜 문자열에서 구문 분석하지 않으려 고합니다. 나중에 응용 프로그램 사용자가 년, 일 및 월을 설정하도록 할 때이 구문 분석을 나중에 수행해야합니다. SimpleDateFormat으로 구문 분석 할 문자열을 작성하려고했습니다. 위의 내용은 이것을 실제로 볼 때 매우 유용합니다. 내 Java 날짜는 하루 전에 인스턴스화 한 날짜 및 시간으로 작성되었습니다. 나는 오늘 인스턴스화 된 gregoriancalendar 날짜와 비교하려고합니다. 진심으로 감사합니다
daveb

8
코드를 수정하십시오 ... 소문자 mm는 분을 나타내고 대문자 MM는 월을 의미합니다.
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());

편집 : date= 의 출력 Fri Jun 15 09:20:21 CEST 2018은 다음과 같습니다

DAY FRIDAY
MONTH JUNE
YEAR 2018

최소한 출력을 넣은 경우 사람들은 코드를 실행하지 않고도 이것이 유용한 지 여부를 결정할 수 있습니다.
SantiBailors 2018 년

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
스택 오버플로에 대한 답변은 코드 스 니펫뿐만 아니라 토론과 설명이 필요합니다. 그리고 코드는 분명히 몇 가지 설명을 사용할 수 있습니다.
Basil Bourque

1
참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
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 (달력 솔루션)가 10 배 더 빠릅니다. 이제 yyyy MM dd 00 00 00이며 날짜를 사용하여 비교하십시오.


2

더 쉬울 수도 있습니다

     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

1이 아닌 0부터 시작하여 조심스럽게 마운트하십시오. 또한 시간과 분을 사용할 때 달력을 pm으로 사용하십시오.

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


1
여기에 표시된 이러한 번거로운 오래된 레거시 클래스를 대체하는 최신 java.time을 사용하는 것이 좋습니다. 정답
Basil Bourque

답변과 제안에 감사드립니다. 매우 좋습니다.
harun ugur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.