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?)
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 :
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!).
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 memberint year =Calendar.getInstance().get(Calendar.YEAR);
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:
publicstaticint getYearFromDate(Date date){int result =-1;if(date !=null){Calendar cal =Calendar.getInstance();
cal.setTime(date);
result = cal.get(Calendar.YEAR);}return result;}
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.
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.
@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.
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;publicstaticvoid main (String[] args){Scanner scannernumber =newScanner(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));}
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):
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
Respuestas:
¿No está seguro si esto cumple con los criterios de no configurar un nuevo calendario? (¿Por qué la oposición a hacerlo?)
fuente
Calendar.getInstance().get(Calendar.YEAR)
es atómico en lo que respecta al cambio externo del reloj, y hacerlosynchronized(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 :fuente
ZoneId
argumento opcional a, ennow
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:
También está la nueva fecha y hora API JSR , así como Joda Time
fuente
La forma más fácil es obtener el año del calendario.
fuente
También puede usar 2 métodos de
java.time.YearMonth
(desde Java 8):fuente
Si desea el año de cualquier objeto de fecha, utilicé el siguiente método:
fuente
tl; dr
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.
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.
Joda-Time
Alguna idea como la anterior, pero usando la biblioteca Joda-Time 2.7.
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 .
Ejemplo en Joda-Time 2.7.
fuente
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.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 se actualizan sus campos y es torpe para la aritmética de fecha y hora.fuente
También puedes usar Java 8
LocalDate
:fuente
Como algunas personas respondieron anteriormente:
Si quiere usar la variable más tarde, mejor use:
Si necesita el año solo para una afección, es mejor que use:
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):
fuente
Use el siguiente código para Java 8:
fuente
En mi caso, ninguno de los anteriores funciona. Entonces, después de probar muchas soluciones, encontré debajo una y funcionó para mí
fuente
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 lojava.time.Instant
usa, entonces (paraUTC
):PS por si acaso (y abreviado para obtener
String
, noint
), el uso seCalendar
ve mejor y puede hacerse consciente de la zona.fuente
Puede hacer todo usando matemáticas enteras sin necesidad de crear una instancia de un calendario:
Puede estar fuera durante una o dos horas en año nuevo, pero no tengo la impresión de que es un problema.
fuente
Utilizo funciones especiales en mi biblioteca para trabajar con entradas de días / mes / año -
fuente