Come posso ottenere il mese come intero da un oggetto Date ( java.util.Date
)?
Come posso ottenere il mese come intero da un oggetto Date ( java.util.Date
)?
Risposte:
Puoi anche usare il pacchetto java.time in Java 8 e convertire il tuo java.util.Date
oggetto in un java.time.LocalDate
oggetto e poi semplicemente usare il getMonthValue()
metodo.
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Si noti che i valori del mese sono qui riportati da 1 a 12 contrariamente alla cal.get(Calendar.MONTH)
risposta di Adarshr che fornisce valori da 0 a 11.
Ma come ha detto Basil Bourque nei commenti, il modo preferito è ottenere un Month
oggetto enum con il LocalDate::getMonth
metodo.
ZoneId.of( "America/Montreal" )
.
Month
oggetto enum piuttosto che un semplice numero intero. Month m = localDate.gotMonth();
Vedi LocalDate::getMonth
metodo L'utilizzo di oggetti come questo rende il codice auto-documentante, garantisce la sicurezza del tipo e garantisce valori validi. Vedi tutorial Enum di Oracle.
date.toInstant()
e ti capita di lavorare con un java.sql.Date
(figlio di java.util.Date
), otterrai un UnsupportedOperationException
. Provanew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
da utilizzando i nuovi metodi di conversione aggiunti a quella vecchia classe. java.sql.Date.valueOf( myLocalDate )
e myJavaSqlDate.toLocalDate()
Inoltre, i driver JDBC aggiornati per JDBC 4.2 o versione successiva non necessitano più di java.sql
tipi e possono indirizzare direttamente i java.time
tipi tramite i metodi ResultSet::getObject
e PreparedStatement::setObject
.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
per nessuna ragione apparente è basato su ZERO, ovvero gennaio == 0. Ora questo è documentato bene nell'API, ma è ancora confuso per gli utenti alle prime armi. Devo ancora trovare qualcuno che possa dirmi perché sono andati con quello - forse il tempo per una nuova domanda SO (anche se temo che non ci sia un grande background a questo: /)
getYear()
è anche, "per nessuna ragione apparente", sottratto dal 1900.
Se usi Java 8 Date API, puoi ottenerlo direttamente in una riga!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
In alternativa, con la classe 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
all'oggetto il suo mese. int month = dateTime.getMonthOfYear();
.toString("MM")
come mostra che ci sono più possibilità di un semplice "MM".
DateTimeZone
oggetto a quel costruttore 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
DettagliLa risposta di Ortomala Lokni per l'utilizzo di java.time è corretta. E dovresti usare java.time in quanto è un enorme miglioramento rispetto alle vecchie classi java.util.Date/.Calendar. Consulta il tutorial Oracle su java.time.
Aggiungerò un po 'di codice che mostra come utilizzare java.time senza riguardo a java.util.Date, per quando inizi con un nuovo codice.
Usando java.time in breve ... An Instant
è un momento sulla linea temporale in UTC. Applica un fuso orario ( ZoneId
) per ottenere un ZonedDateTime
.
La Month
classe è un enum sofisticato per rappresentare un mese in generale. Quell'enum ha metodi utili come ottenere un nome localizzato. E state certi che il numero del mese in java.time è sano, 1-12, non l'assurdità a base zero (0-11) trovata in java.util.Date/.Calendar.
Per ottenere la data-ora corrente, il fuso orario è cruciale. In qualsiasi momento la data non è la stessa in tutto il mondo. Pertanto il mese non è lo stesso in tutto il mondo se vicino alla fine / all'inizio del mese.
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 );
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date
, Calendar
, e SimpleDateFormat
.
Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .
Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*
classi.
Dove ottenere le classi java.time?
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .
Se non puoi usare il tempo Joda e vivi ancora nel mondo oscuro :) (Java 5 o inferiore) puoi goderti questo:
Nota: assicurati che la tua data sia già stata creata nel formato: gg / 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
Il valore restituito inizia da 0, quindi è necessario aggiungerne uno al risultato.
new Date()
meno System.currentTimeMillis
. L'altro è che getMonth è deprecato.