Como obtenho o mês como um número inteiro de um objeto Date ( java.util.Date
)?
Como obtenho o mês como um número inteiro de um objeto Date ( java.util.Date
)?
Respostas:
Você também pode usar o pacote java.time no Java 8 e converter seu java.util.Date
objeto em umjava.time.LocalDate
objeto e, em seguida, basta usar o getMonthValue()
método
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Observe que os valores do mês são dados aqui de 1 a 12, ao contrário cal.get(Calendar.MONTH)
da resposta de adarshr, que fornece valores de 0 a 11.
Mas, como Basil Bourque disse nos comentários, a maneira preferida é obter um Month
objeto enum com o LocalDate::getMonth
método.
ZoneId.of( "America/Montreal" )
.
Month
objeto enum em vez de um mero número inteiro. Month m = localDate.gotMonth();
Veja o LocalDate::getMonth
método O uso de objetos como esse torna seu código auto-documentado, garante a segurança do tipo e garante valores válidos. Consulte o tutorial do Enum da Oracle.
date.toInstant()
e estiver trabalhando com um java.sql.Date
(filho de java.util.Date
), receberá um UnsupportedOperationException
. Tentenew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
usando os novos métodos de conversão adicionados à classe antiga. java.sql.Date.valueOf( myLocalDate )
e myJavaSqlDate.toLocalDate()
Além disso, os drivers JDBC atualizados para o JDBC 4.2 ou posterior não precisam mais de java.sql
tipos e podem endereçar java.time
tipos diretamente pelos métodos 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
sem motivos aparentes, é baseado em ZERO, ou seja, janeiro == 0. Agora isso está bem documentado na API, mas ainda é confuso para os usuários iniciantes. Ainda estou para encontrar alguém que possa me dizer por que eles concordaram com isso - talvez seja o momento de fazer uma nova pergunta para o SO (embora eu tenha medo de que não exista uma grande base para isso: /) #
getYear()
também é "sem razões aparentes", subtraídos por 1900.
Se você usa o Java 8 date api, pode obtê-lo diretamente em uma linha!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
Como alternativa, com a 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
objeto pelo seu mês. int month = dateTime.getMonthOfYear();
.toString("MM")
que mostra, existem mais possibilidades do que apenas "MM".
DateTimeZone
objeto para que o construtor 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
DetalhesA resposta de Ortomala Lokni para o uso de java.time está correta. E você deve usar o java.time, pois é uma melhoria gigantesca em relação às antigas classes java.util.Date/.Calendar. Veja o Tutorial do Oracle em java.time.
Vou adicionar um código que mostra como usar o java.time sem considerar o java.util.Date, para quando você estiver iniciando com um novo código.
Usando java.time em poucas palavras… An Instant
é um momento na linha do tempo no UTC. Aplique um fuso horário ( ZoneId
) para obter umZonedDateTime
.
A Month
classe é uma enumeração sofisticada para representar um mês em geral. Essa enumeração tem métodos úteis, como obter um nome localizado. E tenha certeza de que o número do mês em java.time é sensato, 1 a 12, não o absurdo com base em zero (0 a 11) encontrado em java.util.Date/.Calendar.
Para obter a data e hora atuais, o fuso horário é crucial. A qualquer momento, a data não é a mesma em todo o mundo. Portanto, o mês não é o mesmo em todo o mundo se estiver perto do final / início do mês.
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 );
o estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, comojava.util.Date
,Calendar
, eSimpleDateFormat
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade dejava.sql.*
classes.
Onde obter as classes java.time?
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .
Se você não pode usar o tempo Joda e ainda vive no mundo sombrio :) (Java 5 ou inferior), pode aproveitar o seguinte:
Nota: verifique se a data já foi criada pelo 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
O valor retornado começa em 0, então você deve adicionar um ao resultado.
new Date()
sem fazer isso System.currentTimeMillis
. A outra é que getMonth está obsoleto.