Java: obtener mes entero desde la fecha

¿Cómo obtengo el mes como un entero de un objeto Date ( java.util.Date )?

java.time (Java 8)

También puede usar el paquete java.time en Java 8 y convertir su objeto java.util.Date a un objeto java.time.LocalDate y luego simplemente usar el método getMonthValue() .

 Date date = new Date(); LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); int month = localDate.getMonthValue(); 

Tenga en cuenta que los valores de los meses se dan aquí de 1 a 12 en contra de cal.get(Calendar.MONTH) en la respuesta de adarshr, que da valores de 0 a 11.

Pero como dijo Basil Bourque en los comentarios, la forma preferida es obtener un objeto LocalDate::getMonth del LocalDate::getMonth con el método LocalDate::getMonth .

 java.util.Date date= new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(date); int month = cal.get(Calendar.MONTH); 

Si utiliza la API Java 8 api, ¡puede obtenerla directamente en una línea!

 LocalDate today = LocalDate.now(); int month = today.getMonthValue(); 

Joda-Time

Alternativamente, con la clase Joda-Time DateTime .

 //convert date to datetime DateTime datetime = new DateTime(date); int month = Integer.parseInt(datetime.toString("MM")) 

…o…

 int month = dateTime.getMonthOfYear(); 

tl; dr

 myUtilDate.toInstant() // Convert from legacy class to modern. `Instant` is a point on the timeline in UTC. .atZone( // Adjust from UTC to a particular time zone to determine date. Renders a `ZonedDateTime` object. ZoneId.of( "America/Montreal" ) // Better to specify desired/expected zone explicitly than rely implicitly on the JVM's current default time zone. ) // Returns a `ZonedDateTime` object. .getMonthValue() // Extract a month number. Returns a `int` number. 

Detalles de java.time

La respuesta de Ortomala Lokni para usar java.time es correcta. Y debería usar java.time ya que es una mejora gigantesca con respecto a las antiguas clases de java.util.Date/.Calendar. Vea el Tutorial de Oracle en java.time.

Agregaré un código que muestra cómo usar java.time sin tener en cuenta java.util.Date, para cuando comienzas con código nuevo.

Usando java.time en pocas palabras … Un Instant es un momento en la línea de tiempo en UTC. Aplique una zona horaria ( ZoneId ) para obtener un ZonedDateTime .

La clase Month es una enumeración sofisticada para representar un mes en general. Esa enumeración tiene métodos prácticos como obtener un nombre localizado. Y puede estar seguro de que el número de mes en java.time es uno sano, 1-12, no las tonterías basadas en cero (0-11) que se encuentran en java.util.Date/.Calendar.

Para obtener la fecha y hora actuales, la zona horaria es crucial. En cualquier momento, la fecha no es la misma en todo el mundo. Por lo tanto, el mes no es el mismo en todo el mundo si está cerca del final / comienzo del mes.

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or 'ZoneOffset.UTC'. ZonedDateTime now = ZonedDateTime.now( zoneId ); Month month = now.getMonth(); int monthNumber = month.getValue(); // Answer to the Question. String monthName = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ); 

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

Puede intercambiar objetos java.time directamente con su base de datos. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.* .

¿Dónde obtener las clases de java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
    • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP ….

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .

Si no puede usar el tiempo de Joda y aún vive en el mundo oscuro 🙂 (Java 5 o inferior), puede disfrutar esto:

Nota: asegúrese de que su fecha ya esté hecha con el formato: dd / MM / YYYY

 /** Make an int Month from a date */ public static int getMonthInt(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat("MM"); return Integer.parseInt(dateFormat.format(date)); } /** Make an int Year from a date */ public static int getYearInt(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy"); return Integer.parseInt(dateFormat.format(date)); } 
 Date mDate = new Date(System.currentTimeMillis()); mDate.getMonth() + 1 

El valor devuelto comienza desde 0, por lo que debe agregar uno al resultado.