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


300

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


3
아니오, Java 8 java.util.Date아닌 더 이상 사용 되지 않습니다. 일부 메소드는 더 이상 사용되지 않지만 전체 클래스는 아닙니다. 하지만 당신은 모두를 피해야 java.util.Date하고 java.util.Calendar그들이 악명 혼란, 번잡하고, 결함이있다. 대신 java.time (Java 8) 또는 Joda-Time을 사용하십시오 .
Basil Bourque

답변:


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

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


1
답을 볼 때 Calendar를 사용하는 것이 좋습니다. 나는 하나의 라이너를 찾고 있었고 캘린더가 저를 위해 그것을 가질 것이라고 생각하지 않았습니다. 내가 틀렸다는 것을 증명했다! 감사!
karlgrz

동시성은 어떻습니까? 다른 스레드 / 라이브러리 코드가 현재 시간을 변경하면 어떻게됩니까? 다음과 같이 수정하는 것이 합리적이지 않습니까? Calendar c = Calendar.getInstance (); 동기화 된 (c) {c.setTimeInMillis (System.currentTimeMillis ()); return c.get (Calendar.YEAR);}
jnr

1
이것은 다른 버전의 Android에서 다른 값을 반환합니다. Android v4.1.2와 v4.2.1을 비교하고 있습니다.
toobsco42

2
@ycnix 코드에는 동시성 문제가 없으므로 코드를 더 복잡하게 만들 필요가 없습니다. Calendar.getInstance().get(Calendar.YEAR) 은 시계가 외부에서 변경되는 것과 관련하여 원자 적이며 synchronized(c)로컬 변수의 새로 인스턴스를 작성하는 것은 어쨌든 무의미합니다.
nos

5
import java.util.Calendar
Dominykas Mostauskis

139

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

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

7
JVM의 현재 기본 영역에 의존 ZoneId하기 now보다는 선택적 인수를 항상 전달하는 것이 좋습니다 (런타임 중에 언제든지 변경할 수 있음).
Basil Bourque

다음은이 BTW와 같습니다. int year = Year.now(ZoneId.of("America/New_York")).getValue(); docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
bcmoney

25

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

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

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


이것은 다른 버전의 Android에서 다른 값을 반환합니다. Android v4.1.2와 v4.2.1을 비교하고 있습니다.
toobsco42

1
@ toobsco42- 'android calendar.year 버그'에 대한 인터넷 검색
툴킷

@toolkit, 운이없는 연구를하고 있습니다. 나는 더 구체적인 대답을 바라고 있었다.
toobsco42

4.1.2를 사용하여 전화기에서 SIM 카드를 제거했습니다. 따라서 네트워크에서 전화의 날짜 및 시간을 업데이트 할 수 없었습니다. 결과적으로 휴대 전화는 2012 년에 멈췄습니다. 4.1.2의 버그가 아닌 것 같습니다.
toobsco42

14

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

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

Calendar.YEAR는 현재 연도가 아닙니다.
툴킷

Calendar.YEAR는 이렇게 정의됩니다 ... public final static int YEAR = 1;
cagcowboy

2
Calendar의 get () API는 상수로 지정된 필드에있는 데이텀을 가져옵니다. 연도는 Calendar 객체의 1 필드에 있습니다! Calendar.getInstance ()가 현재 날짜를 가져옵니다. java.sun.com/j2se/1.4.2/docs/api/java/util/…
밥 왕

이것은 다른 버전의 Android에서 다른 값을 반환합니다. Android v4.1.2와 v4.2.1을 비교하고 있습니다.
toobsco42

4.1.2를 사용하여 전화기에서 SIM 카드를 제거했습니다. 따라서 네트워크에서 전화의 날짜 및 시간을 업데이트 할 수 없었습니다. 결과적으로 휴대 전화는 2012 년에 멈췄습니다. 4.1.2의 버그가 아닌 것 같습니다.
toobsco42

13

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

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

오래 전에 게시 된 다른 답변을 잘못 복제 했습니다. 그리고 당신은 질문과 관련이없는 한 달을 생산합니다. 시간대의 중요한 문제는 무시합니다. 그리고 서식이 지저분합니다. 스택 오버플로에 참여하게되어 기쁩니다. 그러나이 답변은 충분하지 않습니다. 약점을 수정하고 다른 답변에서 이미 제공 한 것보다 더 많은 가치를 추가하도록 편집하십시오. 또는 다운 투표를 수집하기 전에 답변을 삭제하십시오. PS 슈퍼 아바타 아이콘!
Basil Bourque

고마워요 편집했습니다. 링크는 내 방식과 조금 다릅니다
Zhurov Konstantin

10

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

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

결과는 1970 년입니다!
Dr. aNdRO

10

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

2
게으른 것들에 대한 모든 영역 ID (나) : mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB

1
@FBB 공식 IANA 표준 시간대 이름 목록대한 Wikipedia 페이지를 제안합니다 . 주의 :이 영역은 놀라 울 정도로 자주 변경됩니다. 당신이 정말로 최신 정보를 원하는 경우의 새 복사본 다운로드 데이터 파일 자신을. 파일을 숙독 할 수 있습니다. Java 구현에서 오래된 tzdata를 바꿀 수 있습니다. Oracle은 해당 JVM에 대한 업데이터 도구 를 제공합니다 . tzdata
Basil Bourque

4

응용 프로그램에서 Date 및 Calendar 객체를 많이 사용하는 경우 java.util.Date변경 가능 하므로 Joda Time을 사용해야합니다 . java.util.Calendar필드가 업데이트 될 때 성능 문제가 있으며 날짜 시간 산술에 어려움이 있습니다.



3

어떤 사람들은 위에서 대답했듯이 :

나중에 변수를 사용하려면 다음을 사용하는 것이 좋습니다.

int year;

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

조건에 맞는 연도가 필요한 경우 다음을 사용하는 것이 좋습니다.

Calendar.getInstance().get(Calendar.YEAR)

예를 들어 도입 된 수표가 현재 연도 200보다 작거나 현재 연도보다 많을 때 (출생일 수 있음)이를 수행에 사용하는 경우 :

import java.util.Calendar;
import java.util.Scanner;

public static void main (String[] args){

    Scanner scannernumber = new Scanner(System.in);
    int year;

    /*Checks that the year is not higher than the current year, and not less than the current year - 200 years.*/

    do{
        System.out.print("Year (Between "+((Calendar.getInstance().get(Calendar.YEAR))-200)+" and "+Calendar.getInstance().get(Calendar.YEAR)+") : ");
        year = scannernumber.nextInt();
    }while(year < ((Calendar.getInstance().get(Calendar.YEAR))-200) || year > Calendar.getInstance().get(Calendar.YEAR));
}

3

java 8에 다음 코드를 사용하십시오.

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();

0

내 경우에는 위의 어느 것도 작동하지 않습니다. 그래서 많은 솔루션을 시도한 후에 하나 아래에서 발견했으며 그것은 나를 위해 일했습니다.

import java.util.Scanner;
import java.util.Date;

public class Practice
{   
    public static void main(String[] args)
    {
        Date d=new Date();  
        int year=d.getYear();
        int currentYear=year+1900;    

        System.out.println(currentYear);

    }

}

이 방법은 더 이상 사용되지 않습니다. 그리고 그 끔찍한 클래스는 JSR 310에 정의 된 java.time 클래스에 의해 몇 년 전에 대체되었습니다. assyliasAnswer 에서 현대 솔루션을 참조하십시오 .
바질 부르 케

-1

Java 버전 8 이상에서는 java.time 라이브러리를 사용할 있습니다. ISO 8601 은 날짜를 작성하는 표준 방법을 설정 YYYY-MM-DD하고 java.time.Instant사용합니다 UTC.

import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));

PS는 경우에 따라 (을 얻는 String것이 아니라 짧게 int) 사용하면 Calendar더 좋아 보이고 영역을 인식 할 수 있습니다.


시간대의 중요한 문제를 무시하고 있습니다. 다른 Answer 에서 더 간단한 해결책을 참조하십시오 .
바질 부르 케

-2

달력을 인스턴스화하지 않고도 Integer math를 사용하여 모든 작업을 수행 할 수 있습니다.

return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);

새해에 한두 시간 쉬어도되지만 문제가되는 인상을받지 못합니까?


9
아마도 당신은 사과를 위해 일하고 있습니까? macworld.com/article/2023580/…
Stefan Paul Noack

와우, 이것은 매우 무겁습니다. cagcowboy가 보여준 것처럼 간단하게 유지하는 것이 좋습니다.
LStrike

모든 상황에서 가장 좋은 것은 아니지만 다운 보트를받을 자격이 없습니다.
JohnnyLambada

-4

라이브러리에서 특수 함수를 사용하여 일 / 월 / 년 int로 작업합니다.

int[] int_dmy( long timestamp ) // remember month is [0..11] !!!
{
  Calendar cal = new GregorianCalendar(); cal.setTimeInMillis( timestamp );
  return new int[] { 
    cal.get( Calendar.DATE ), cal.get( Calendar.MONTH ), cal.get( Calendar.YEAR )
  };
};


int[] int_dmy( Date d ) { 
 ...
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.