¿Cómo obtengo el mes como un entero de un objeto Date ( java.util.Date
)?
¿Cómo obtengo el mes como un entero de un objeto Date ( java.util.Date
)?
Respuestas:
También puede usar el paquete java.time en Java 8 y convertir su java.util.Date
objeto en un java.time.LocalDate
objeto y luego simplemente usar el getMonthValue()
método.
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Tenga en cuenta que los valores del mes se dan aquí del 1 al 12, al contrario de lo que cal.get(Calendar.MONTH)
dice la respuesta de adarshr, que da valores del 0 al 11.
Pero como dijo Basil Bourque en los comentarios, la forma preferida es obtener un Month
objeto enum con el LocalDate::getMonth
método.
ZoneId.of( "America/Montreal" )
.
Month
objeto enum en lugar de un simple número entero. Month m = localDate.gotMonth();
Ver LocalDate::getMonth
método El uso de objetos como este hace que su código se documente automáticamente, garantiza la seguridad de escritura y garantiza valores válidos. Vea el tutorial de Enum de Oracle.
date.toInstant()
y estás trabajando con un java.sql.Date
(el hijo de java.util.Date
) entonces obtendrás un UnsupportedOperationException
. Pruebanew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
usando los nuevos métodos de conversión agregados a esa clase anterior. java.sql.Date.valueOf( myLocalDate )
y myJavaSqlDate.toLocalDate()
Además, los conductores JDBC actualizan para JDBC 4.2 o posterior ya no necesitan java.sql
tipos, y directamente puede abordar java.time
tipos a través de la ResultSet::getObject
y PreparedStatement::setObject
métodos.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
no hay razones aparentes basadas en CERO, es decir, enero == 0. Ahora eso está bien documentado en la API, pero sigue siendo confuso para los usuarios nuevos. Todavía tengo que encontrar a alguien que pueda decirme por qué se fueron con eso, tal vez es hora de una nueva pregunta SO (aunque me temo que no hay ningún gran fondo para eso: /)
getYear()
también es, "sin razones aparentes", restado en 1900.
Si usa la API de fecha de Java 8 , ¡puede obtenerla directamente en una línea!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
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();
DateTime
objeto por su mes. int month = dateTime.getMonthOfYear();
.toString("MM")
ya que muestra que hay más posibilidades que solo "MM".
DateTimeZone
objeto a ese constructor Tiempo: DateTimeZone.forID( "America/Montreal" )
.
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.
java.time
DetallesLa respuesta de Ortomala Lokni para usar java.time es correcta. Y debería usar java.time ya que es una mejora gigantesca sobre las antiguas clases java.util.Date/.Calendar. Consulte el Tutorial de Oracle en java.time.
Agregaré algún código que muestre cómo usar java.time sin tener en cuenta java.util.Date, para cuando comience con un código nuevo.
Usando java.time en pocas palabras ... Un Instant
es un momento en la línea de tiempo en UTC. Aplicar una zona horaria ( ZoneId
) para obtener a ZonedDateTime
.
La Month
clase es una enumeración sofisticada para representar un mes en general. Esa enumeración tiene métodos útiles, como obtener un nombre localizado. Y tenga la seguridad de que el número de mes en java.time es cuerdo, 1-12, no el sinsentido basado en cero (0-11) que se encuentra en java.util.Date/.Calendar.
Para obtener la fecha y hora actual, 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 );
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases 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. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de java.sql.*
clases.
¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted 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 / AAAA
/**
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.
new Date()
sin hacerlo System.currentTimeMillis
. El otro es que getMonth está en desuso.