Pregunta

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

¿Fue útil?

Solución

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

Otros consejos

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), puede usar el método Year :: now :

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

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

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

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

La forma más sencilla es obtener el año en el calendario.

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

También puedes 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();

tl; dr

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

Zona horaria

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

  

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

El 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. Es mejor especificar la zona horaria.

Por cierto, siempre use nombres de zona horaria adecuados como 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() ;

Joda-Time

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

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

Año de incremento / decremento

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

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 poco convencional para la aritmética de fecha y hora.

También puede utilizar LocalDate de Java 8 :

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

Como algunas personas respondieron anteriormente:

Si desea usar la variable más adelante, use mejor:

int year;

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

Si necesita el año solo por una condición que 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));
}

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

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

Uso 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 ) { 
 ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top