Comment obtenir le mois sous forme d'entier à partir d'un objet Date ( java.util.Date
)?
Comment obtenir le mois sous forme d'entier à partir d'un objet Date ( java.util.Date
)?
Réponses:
Vous pouvez également utiliser le package java.time dans Java 8 et convertir votre java.util.Date
objet en java.time.LocalDate
objet, puis simplement utiliser la getMonthValue()
méthode.
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Notez que les valeurs des mois sont ici données de 1 à 12 contrairement à cal.get(Calendar.MONTH)
la réponse d'adarshr qui donne des valeurs de 0 à 11.
Mais comme Basil Bourque l'a dit dans les commentaires, la méthode préférée est d'obtenir un Month
objet enum avec la LocalDate::getMonth
méthode.
ZoneId.of( "America/Montreal" )
.
Month
objet enum plutôt qu'un simple nombre entier. Month m = localDate.gotMonth();
Voir la LocalDate::getMonth
méthode. L'utilisation d'objets tels que celui-ci rend votre code auto-documenté, garantit la sécurité du type et garantit des valeurs valides. Voir le didacticiel Enum d'Oracle.
date.toInstant()
et que vous travaillez avec un java.sql.Date
(l'enfant de java.util.Date
), vous obtiendrez un fichier UnsupportedOperationException
. Essayernew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
en utilisant les nouvelles méthodes de conversion ajoutées à cette ancienne classe. java.sql.Date.valueOf( myLocalDate )
et myJavaSqlDate.toLocalDate()
aussi, les pilotes JDBC mis à jour pour JDBC 4.2 ou version ultérieure ne ont plus besoin java.sql
types, et peuvent aborder directement les java.time
types via ResultSet::getObject
et PreparedStatement::setObject
méthodes.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
n'est pour aucune raison apparente basée sur ZERO, c'est-à-dire janvier == 0. Maintenant, c'est bien documenté dans l'API, mais c'est toujours déroutant pour les nouveaux utilisateurs. Je n'ai encore trouvé personne qui pourrait me dire pourquoi ils ont opté pour cela - peut-être temps pour une nouvelle question SO moi-même (bien que je crains qu'il n'y ait pas de bon contexte à cela: /)
getYear()
est également, "pour aucune raison apparente", soustrait de 1900.
Si vous utilisez l' API de date Java 8 , vous pouvez l'obtenir directement en une seule ligne!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
Alternativement, avec la classe Joda-Time DateTime
.
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
…ou…
int month = dateTime.getMonthOfYear();
DateTime
objet son mois. int month = dateTime.getMonthOfYear();
.toString("MM")
car il montre qu'il y a plus de possibilités que juste "MM".
DateTimeZone
objet à ce constructeur DateTime: 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
DétailsLa réponse d'Ortomala Lokni pour l'utilisation de java.time est correcte. Et vous devriez utiliser java.time car il s'agit d'une amélioration gigantesque par rapport aux anciennes classes java.util.Date/.Calendar. Consultez le didacticiel Oracle sur java.time.
J'ajouterai du code montrant comment utiliser java.time sans égard à java.util.Date, lorsque vous commencez avec du nouveau code.
Utiliser java.time en un mot… An Instant
est un moment sur la chronologie en UTC. Appliquez un fuseau horaire ( ZoneId
) pour obtenir un fichier ZonedDateTime
.
La Month
classe est une énumération sophistiquée pour représenter un mois en général. Cette énumération a des méthodes pratiques telles que l'obtention d'un nom localisé. Et soyez assurés que le numéro du mois dans java.time est un mois sain, 1-12, et non le non-sens de base zéro (0-11) trouvé dans java.util.Date/.Calendar.
Pour obtenir la date-heure actuelle, le fuseau horaire est crucial. A tout moment, la date n'est pas la même dans le monde. Par conséquent, le mois n'est pas le même dans le monde s'il se rapproche de la fin / du début du mois.
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 );
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date
, Calendar
, et SimpleDateFormat
.
Le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*
classes.
Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval
, YearWeek
, YearQuarter
et plus .
Si vous ne pouvez pas utiliser Joda time et que vous vivez toujours dans le monde sombre :) (Java 5 ou inférieur), vous pouvez en profiter:
Remarque: assurez-vous que votre date est déjà faite au format: jj / 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
La valeur renvoyée commence à 0, vous devez donc en ajouter un au résultat.
new Date()
passant System.currentTimeMillis
. L'autre est que getMonth est obsolète.