답변:
int year = Calendar.getInstance().get(Calendar.YEAR);
새 캘린더를 설정하지 않은 기준에 맞는지 확실하지 않습니까? (왜 반대 하는가?)
Calendar.getInstance().get(Calendar.YEAR)
은 시계가 외부에서 변경되는 것과 관련하여 원자 적이며 synchronized(c)
로컬 변수의 새로 인스턴스를 작성하는 것은 어쨌든 무의미합니다.
import java.util.Calendar
Java 8의 시간 API를 사용하여 (시스템의 기본 시간대에서 연도를 얻는 것이 좋다고 가정) 다음 Year::now
방법을 사용할 수 있습니다 .
int year = Year.now().getValue();
ZoneId
하기 now
보다는 선택적 인수를 항상 전달하는 것이 좋습니다 (런타임 중에 언제든지 변경할 수 있음).
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
가장 간단한 (캘린더 사용, 미안)는 다음과 같습니다.
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();
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 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 ) ;
tzdata
Java 8을 사용할 수도 있습니다 LocalDate
.
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
어떤 사람들은 위에서 대답했듯이 :
나중에 변수를 사용하려면 다음을 사용하는 것이 좋습니다.
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));
}
내 경우에는 위의 어느 것도 작동하지 않습니다. 그래서 많은 솔루션을 시도한 후에 하나 아래에서 발견했으며 그것은 나를 위해 일했습니다.
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);
}
}
달력을 인스턴스화하지 않고도 Integer math를 사용하여 모든 작업을 수행 할 수 있습니다.
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
새해에 한두 시간 쉬어도되지만 문제가되는 인상을받지 못합니까?
라이브러리에서 특수 함수를 사용하여 일 / 월 / 년 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 ) {
...
}
java.util.Date
이 아닌 더 이상 사용 되지 않습니다. 일부 메소드는 더 이상 사용되지 않지만 전체 클래스는 아닙니다. 하지만 당신은 모두를 피해야java.util.Date
하고java.util.Calendar
그들이 악명 혼란, 번잡하고, 결함이있다. 대신 java.time (Java 8) 또는 Joda-Time을 사용하십시오 .