2008-09-25 18 views
205

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

+2

No, 'java.util.Date' está * no * desaprobado, no como de Java 8. Algunos de sus métodos están en desuso, pero no toda la clase. Pero debe evitar tanto 'java.util.Date' como' java.util.Calendar' ya que son notoriamente molestos, confusos y defectuosos. En su lugar, utilice [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) (en Java 8) o [Joda-Time] (http : //www.joda.org/joda-time/). –

Respuesta

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

+0

Al ver su respuesta, Calendar sería un buen objeto para usar. Estaba buscando una línea y no pensé que Calendar lo tuviera para mí. Probado mal, yo soy! ¡Gracias! – karlgrz

+0

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

+0

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

12

La manera 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); 
+0

Calendar.YEAR no es el año actual. – toolkit

+0

Calendar.YEAR se define así ... public final static int AÑO = 1; – cagcowboy

+2

La API get() en Calendar obtiene el dato que está en el campo especificado por la constante. ¡El año está ubicado en el campo de 1 en el objeto Calendario! Calendar.getInstance() obtiene la fecha actual. http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#get(int) –

24

Este simple (utilizando el Calendario, lo siento) es:

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

También existe la nueva Date and Time API JSR, así como Joda Time

+0

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

+0

@ toobsco42 - prueba google para 'error calendario android.año' – toolkit

+0

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

4

Si la aplicación está haciendo un uso intensivo de fecha y el calendario objetos, 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.

-4

que utilizan funciones especiales en mi biblioteca para trabajar con días/mes enteros/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) { 
... 
} 
-3

Usted puede hacer todo esto usando Operaciones aritméticas con enteros sin necesidad de crear una instancia 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.

+4

Espero que nunca toque el código de ninguna alarma. – berezovskyi

+7

¿Estás trabajando para Apple, quizás? http://www.macworld.com/article/2023580/ios-do-not-disturb-feature-oversleeps-on-new-year-s-day.html –

+0

wow, esto es muy pesado, sugeriría que se mantenga es simple como cagcowboy lo ha demostrado. – LStrike

10

Si desea que el año de cualquier objeto de fecha, he usado 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; 
} 
3

Como algunas personas respondieron arriba:

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

int year; 

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

Si necesita del año por sólo una condición que mejor uso:

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

Por ejemplo usarlo en un do, mientras que los cheques introducidos año no es menor que el año-200 o más que el año en curso 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)); 
} 
2

También puede utilizar Java 8 de LocalDate:

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

Nota: esto solo funciona en Java 8 –

+0

@ AndrewT., Obtenga [el ThreeTen Backport] (http://www.threeten.org/threetenbp/) y también funcionará en Java 6 y 7. –

6

tl; dr

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

zona horaria

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

int year = LocalDate.ahora(). 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 la zona horaria del sistema host o cualquier código de Java en cualquier momento cambiando el valor predeterminado actual de la JVM. Es mejor especificar la zona horaria.

Por cierto, siempre use proper time zone names. 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

Algunos idea que el anterior, pero utilizando la biblioteca Joda-Time 2.7.

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

incremental/Decrementar Año

Si su objetivo es saltar de un año a la vez, sin necesidad de extraer el número de años. 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) ; 
+0

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

62

El uso de la API en tiempo de Java 8 (suponiendo que usted es feliz de conseguir el año en la zona horaria predeterminada del sistema), se puede usar the Year::now method:

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

Sugiero siempre pasar el 'ZoneId opcional 'argumento a' ahora' en lugar de confiar implícitamente en la zona predeterminada actual de la JVM (¡que puede cambiar en cualquier momento durante el tiempo de ejecución!). –

-1

Así es como me solía, simple y más fácil

Integer currentYear = gregorianDate.getYear(); 
Integer comeupYear = currentYear+1; 
Integer previousYear = currentYear-1; 
1

también puede utilizar 2 métodos de java.time.YearMonth (ya que Java 8):

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

Duplica incorrectamente [otra Respuesta] (https://stackoverflow.com/a/33700141/642706) publicada hace mucho tiempo. Y produces un mes que es irrelevante para la Pregunta. E ignoras el problema crucial de la zona horaria. Y tu formateo es complicado. Me alegra verte participar en Stack Overflow. Pero esta respuesta no es lo suficientemente buena. Edite para corregir sus puntos débiles y agregue más valor más allá de lo ya provisto por las otras Respuestas. O elimine su respuesta antes de que recolecte votos abajo. PD Icono de Super avatar! –

+0

Muchas gracias, hombre. He editado el enlace es un poco diferente a mi manera –

Cuestiones relacionadas