Obtenga el valor entero del año actual en Java


300

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


3
No, nojava.util.Date está en desuso, no a partir de Java 8. Algunos de sus métodos están en desuso, pero no toda la clase. Sin embargo, se debe evitar tanto y ya que son notoriamente molesto, confuso y defectuoso. En su lugar, use java.time (en Java 8) o Joda-Time . java.util.Datejava.util.Calendar
Basil Bourque

Respuestas:


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


1
Al ver su respuesta, Calendar sería un buen objeto para usar. Estaba buscando una frase y no pensé que Calendar la tuviera para mí. ¡Estoy equivocado! ¡Gracias!
karlgrz

¿Qué pasa con la concurrencia, qué pasa si otro hilo / fragmento de código de biblioteca cambia la hora actual? ¿No sería razonable modificarlo a algo como: Calendario c = Calendar.getInstance (); sincronizado (c) {c.setTimeInMillis (System.currentTimeMillis ()); return c.get (Calendar.YEAR);}
jnr

1
Esto devuelve un valor diferente en diferentes versiones de Android. Estoy comparando Android v4.1.2 con v4.2.1.
toobsco42

2
@ycnix No hay problema de concurrencia con el código, por lo que no hay necesidad de hacerlo más compilado. Calendar.getInstance().get(Calendar.YEAR) es atómico en lo que respecta al cambio externo del reloj, y hacerlo synchronized(c)en una nueva instancia de una variable local de todos modos sería muy inútil aquí.
nos

55
import java.util.Calendar
Dominykas Mostauskis

139

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

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

77
Sugiero pasar siempre el ZoneIdargumento opcional a, en nowlugar de depender implícitamente de la zona predeterminada actual de la JVM (¡eso puede cambiar en cualquier momento durante el tiempo de ejecución!).
Basil Bourque

Que se ve así 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

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

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

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


Esto devuelve un valor diferente en diferentes versiones de Android. Estoy comparando Android v4.1.2 con v4.2.1.
toobsco42

1
@ toobsco42 - intente buscar en Google 'android calendar.year bug'
toolkit

Hola @toolkit, he estado investigando sin suerte. Esperaba una respuesta más específica.
toobsco42

Quité mi tarjeta SIM del teléfono con 4.1.2. Por lo tanto, la red no pudo actualizar la fecha y la hora en el teléfono. En consecuencia, el teléfono se atascó en 2012. Parece que esto no es un error en 4.1.2.
toobsco42

14

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

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

Calendar.YEAR no es el año actual.
kit de herramientas el

Calendar.YEAR se define así ... public final static int YEAR = 1;
cagcowboy

2
La API get () en Calendar obtiene el dato que está en el campo especificado por la constante. ¡El año se encuentra en el campo 1 en el objeto Calendario! Calendar.getInstance () está obteniendo la fecha actual. java.sun.com/j2se/1.4.2/docs/api/java/util/…
Bob King

Esto devuelve un valor diferente en diferentes versiones de Android. Estoy comparando Android v4.1.2 con v4.2.1.
toobsco42

Quité mi tarjeta SIM del teléfono con 4.1.2. Por lo tanto, la red no pudo actualizar la fecha y la hora en el teléfono. En consecuencia, el teléfono se atascó en 2012. Parece que esto no es un error en 4.1.2.
toobsco42

12

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

Duplica incorrectamente otra respuesta publicada hace mucho tiempo. Y produce un mes que es irrelevante para la pregunta. E ignoras el tema crucial de la zona horaria. Y su formato es desordenado. Me alegra verte participando en Stack Overflow. Pero esta respuesta no es lo suficientemente buena. Edite para corregir sus debilidades y agregue más valor más allá de lo que ya proporcionan las otras Respuestas. O elimine su respuesta antes de que recoja los votos negativos. ¡Icono de super avatar de PS!
Basil Bourque

Muchas gracias hombre. He editado el enlace es un poco diferente a mi manera
Zhurov Konstantin

10

Si desea el año de cualquier objeto de fecha, utilicé 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;
}

¡El resultado es 1970!
Dr. aNdRO

10

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 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 todavía es "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, utilice siempre los nombres de zona horaria adecuados según lo definido por la IANA . Nunca use los códigos de 3-4 letras que no son 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 usando la biblioteca Joda-Time 2.7.

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

Año creciente / decreciente

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 java.time .

ZonedDateTime zdt = 
    ZonedDateTime
    .now(  ZoneId.of( "Africa/Casablanca" )  )
    .minusYears( 1 ) 
;

Ejemplo en Joda-Time 2.7.

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

2
Todos los ID de zona para los perezosos (como yo): mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB

1
@FBB Sugiero la página de Wikipedia para la lista oficial de nombres de zonas horarias de la IANA . Cuidado: estas zonas cambian sorprendentemente a menudo. Si realmente quieres de información actualizada, descarga una copia nueva de la tzdataarchivo de datos usted mismo. Puedes leer detenidamente el archivo. Y puede reemplazar un tzdata desactualizado en su implementación de Java. Oracle proporciona una herramienta de actualización para su JVM.
Basil Bourque

4

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.Datees mutable. java.util.Calendartiene problemas de rendimiento cuando se actualizan sus campos y es torpe para la aritmética de fecha y hora.



3

Como algunas personas respondieron anteriormente:

Si quiere usar la variable más tarde, mejor use:

int year;

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

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

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

Por ejemplo, usarlo en un do mientras que el año introducido de cheques 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));
}

3

Use el siguiente código para Java 8:

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

0

En mi caso, ninguno de los anteriores funciona. Entonces, después de probar muchas soluciones, encontré debajo una y funcionó para mí

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

    }

}

Ese método está en desuso. Y esa clase terrible fue suplantada hace años por las clases java.time definidas en JSR 310. Vea la solución moderna en la Respuesta de assylias .
Basil Bourque

sí, pero estaba buscando activamente una solución y probé muchas soluciones disponibles y para mí esta funcionó, así que
publiqué

-1

En Java, la versión 8+ puede (se recomienda) usar la biblioteca java.time . ISO 8601 establece la forma estándar de escribir fechas: YYYY-MM-DDy lo java.time.Instantusa, entonces (para UTC):

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

PS por si acaso (y abreviado para obtener String, no int), el uso se Calendarve mejor y puede hacerse consciente de la zona.


Estás ignorando el tema crucial de la zona horaria. Ver solución más simple en otra respuesta .
Basil Bourque

-2

Puede hacer todo usando matemáticas enteras sin necesidad de crear una instancia de un calendario:

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

Puede estar fuera durante una o dos horas en año nuevo, pero no tengo la impresión de que es un problema.


99
¿Estás trabajando para Apple, tal vez? macworld.com/article/2023580/…
Stefan Paul Noack

wow, esto es muy pesado, sugeriría que sea simple como lo demostró cagcowboy.
LStrike

Esto puede no ser el mejor en todas las circunstancias, pero no merece votos negativos.
JohnnyLambada

-4

Utilizo funciones especiales en mi biblioteca para trabajar con entradas de 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 ) { 
 ...
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.