Obtener el valor entero del año actual en Java

Necesito determinar el año actual en Java como un número entero. Podría simplemente usar java.util.Date() , pero está en desuso.

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

¿No estoy seguro si esto cumple con el criterio de no configurar un nuevo calendario? (¿Por qué la oposición a hacerlo?)

Utilizando la API de tiempo de Java 8 (suponiendo que esté satisfecho de obtener el año en la zona horaria predeterminada de su sistema), puede usar el método Year::now :

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

Esto más simple (usando Calendar, lo siento) es:

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

También está el nuevo JSR API de fecha y hora , así como Joda Time

La forma más fácil es obtener el año de Calendar.

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

Si desea el año de cualquier objeto de fecha, usé el siguiente método:

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

Zona horaria

La respuesta de Raffi Khatchadourian muestra sabiamente cómo usar el nuevo paquete java.time en Java 8. Pero esa respuesta no aborda el problema crítico de la zona horaria para determinar una fecha.

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

Ese código depende de la zona horaria predeterminada actual de la JVM. La zona predeterminada se usa para determinar la fecha de hoy. Recuerde, por ejemplo, que en el momento después de la medianoche en París, la fecha en Montreal sigue siendo “ayer”.

Por lo tanto, los resultados pueden variar según la máquina en la que se ejecute, un usuario / administrador que cambie el huso horario del sistema operativo del host o cualquier código Java en cualquier momento que cambie el valor predeterminado actual de la JVM. Es mejor especificar la zona horaria.

Por cierto, siempre use los nombres adecuados de huso horario según lo definido por IANA . Nunca use los códigos de 3-4 letras que no están estandarizados ni son únicos.

java.time

Ejemplo en java.time de Java 8.

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

Joda-Time

Alguna idea como la anterior, pero usando la biblioteca Joda-Time 2.7.

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

Incrementando / Disminuyendo Año

Si su objective es saltar un año a la vez, no es necesario extraer el número del año. Tanto Joda-Time como java.time tienen métodos para sumr / restar un año a la vez. Y esos métodos son inteligentes, manejan el horario de verano y otras anomalías.

Ejemplo en Joda-Time 2.7.

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

Si su aplicación está haciendo un uso intensivo de los objetos de fecha y calendario, realmente debería usar Joda Time, porque java.util.Date es mutable. java.util.Calendar tiene problemas de rendimiento cuando sus campos se actualizan, y es torpe para la aritmética de fecha y hora.

Como algunas personas respondieron anteriormente:

Si desea utilizar la variable más adelante, mejor uso:

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

Si necesita el año solo por una afección, es mejor que use:

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

Por ejemplo, usarlo en un do mientras que los controles introducidos en el año no es menor que el año actual: 200 o más que el año actual (podría ser el año de nacimiento):

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

También puede usar LocalDate Java 8:

 import java.time.LocalDate; //... int year = LocalDate.now().getYear(); 

También puede usar 2 métodos de java.time.YearMonth (desde Java 8):

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

Puede hacer todo el proceso utilizando matemáticas enteras sin necesidad de crear instancias de un calendario:

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

Puede estar apagado durante una o dos horas al año nuevo, pero no me da la impresión de que sea un problema.

Utilizo funciones especiales en mi biblioteca para trabajar con días / mes / año.

 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 ) { ... }