valor tipos primitivos objeto maximo ejemplos ejemplo definicion datos java datetime date

tipos - Obtener valor entero del año en curso en Java



tipos de variables en java ejemplos (12)

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


tl; dr

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

Zona horaria

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

int año = LocalDate.now (). getYear ();

Ese código depende de la zona horaria predeterminada actual de la JVM. La zona predeterminada se usa para determinar cuál es la fecha de hoy. Recuerde, por ejemplo, que en el momento posterior a la medianoche en París, la fecha en Montreal sigue siendo "ayer".

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

Por cierto, siempre use nombres de zona horaria adecuados según lo definido por la IANA . Nunca use los códigos de 3 a 4 letras que no sean ni estandarizados ni únicos.

java.time

Ejemplo en java.time de Java 8.

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

Tiempo de joda

Alguna idea como la anterior, pero usando la librería Joda-Time 2.7.

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

Incremento / decremento año

Si su objetivo 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 sumar / 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 ) ;


Como algunas personas respondieron arriba:

Si quieres usar la variable más adelante, mejor usa:

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

Si necesita el año solo por una condición, mejor use:

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

Por ejemplo, usarlo en un do mientras que los cheques introducidos 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)); }


Este más simple (usando el calendario, lo siento) es:

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

También existe la nueva API JSR de fecha y hora , así como Joda Time.


La forma más fácil es obtener el año desde el calendario.

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


Puede hacer todo esto utilizando Matemáticas integrales sin necesidad de crear una instancia de un calendario:

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

Puede estar fuera por una hora o dos en el año nuevo, pero no tengo la impresión de que sea un problema.


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


Si su aplicación está haciendo un uso intensivo de los objetos de fecha y calendario, 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 poco convencional para aritmética de fecha y hora.


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


También puede utilizar LocalDate Java 8:

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


Usando la API de tiempo de Java 8 (asumiendo que está feliz de obtener el año en la zona horaria predeterminada de su sistema), podría usar el método Year::now :

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


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


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

¿No está seguro si esto cumple con los criterios de no configurar un nuevo calendario? (¿Por qué la oposición a hacerlo?)