Respuestas:
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?)
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í.
import java.util.Calendar
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::now
método :
int year = Year.now().getValue();
ZoneId
argumento opcional a, en now
lugar de depender implícitamente de la zona predeterminada actual de la JVM (¡eso puede cambiar en cualquier momento durante el tiempo de ejecución!).
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
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
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);
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();
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;
}
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
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.
Ejemplo en java.time de Java 8.
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
Alguna idea como la anterior, pero usando la biblioteca Joda-Time 2.7.
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
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 ) ;
tzdata
archivo 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.
También puedes usar Java 8 LocalDate
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
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));
}
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);
}
}
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-DD
y lo java.time.Instant
usa, 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 Calendar
ve mejor y puede hacerse consciente de la zona.
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.
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 ) {
...
}
java.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.Date
java.util.Calendar