[java] Java에서 현재 연도의 정수 값 가져 오기

Java의 현재 연도를 정수로 결정해야합니다. 그냥 사용할 java.util.Date()수는 있지만 더 이상 사용되지 않습니다.



답변

int year = Calendar.getInstance().get(Calendar.YEAR);

새 캘린더를 설정하지 않은 기준에 맞는지 확실하지 않습니까? (왜 반대 하는가?)


답변

Java 8의 시간 API를 사용하여 (시스템의 기본 시간대에서 연도를 얻는 것이 좋다고 가정) 다음 Year::now방법을 사용할 수 있습니다 .

int year = Year.now().getValue();


답변

가장 간단한 (캘린더 사용, 미안)는 다음과 같습니다.

 int year = Calendar.getInstance().get(Calendar.YEAR);

Joda Time 뿐만 아니라 새로운 Date and Time API JSR 도 있습니다.


답변

가장 쉬운 방법은 달력에서 연도를 얻는 것입니다.

// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);


답변

java.time.YearMonth(Java 8 이후) 에서 두 가지 방법을 사용할 수도 있습니다 .

import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();


답변

날짜 객체의 연도를 원하면 다음 방법을 사용했습니다.

public static int getYearFromDate(Date date) {
    int result = -1;
    if (date != null) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        result = cal.get(Calendar.YEAR);
    }
    return result;
}


답변

tl; dr

ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  )
             .getYear()

시간대

Raffi Khatchadourian 의 대답 은 현명하게 Java 8에서 새로운 java.time 패키지 를 사용하는 방법을 보여줍니다. 그러나 그 대답은 날짜를 결정할 때 시간대의 중요한 문제를 해결하지 못합니다.

int year = LocalDate.now (). getYear ();

이 코드는 JVM의 현재 기본 시간대에 따라 다릅니다. 기본 영역은 오늘 날짜를 결정하는 데 사용됩니다. 예를 들어 파리 자정이 지나면 몬트리올의 날짜는 여전히 ‘어제’입니다.

따라서 결과는 실행되는 시스템, 호스트 OS 시간대를 변경하는 사용자 / 관리자 또는 JVM의 현재 기본값을 변경하는 Java 코드 따라 달라질 수 있습니다 . 시간대를 지정하는 것이 좋습니다.

그건 그렇고, 항상 IANA에 의해 정의 된 올바른 시간대 이름 을 사용 하십시오 . 표준화되거나 고유하지 않은 3-4 자 코드를 사용하지 마십시오.

java.time

Java 8의 java.time 예제

int year = ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  ).getYear() ;

조다 타임

위와 같은 아이디어이지만 Joda-Time 2.7 라이브러리를 사용합니다.

int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;

증가 / 감소 연도

목표가 한 번에 1 년마다 점프하는 것이라면 연도 번호를 추출 할 필요가 없습니다. Joda-Time과 java.time에는 한 번에 1 년을 더하거나 빼는 방법이 있습니다. 그리고 이러한 방법은 일광 절약 시간 및 기타 이상을 처리하는 것이 현명합니다.

Joda-Time의 예 2.7.

DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;