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.Dateobjeto 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 Monthobjeto enum com o LocalDate::getMonthmétodo.
ZoneId.of( "America/Montreal" ).
Monthobjeto enum em vez de um mero número inteiro. Month m = localDate.gotMonth();Veja o LocalDate::getMonthmé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.Dateusando 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.sqltipos e podem endereçar java.timetipos diretamente pelos métodos ResultSet::getObjecte PreparedStatement::setObject.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTHsem 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();
DateTimeobjeto pelo seu mês. int month = dateTime.getMonthOfYear();
.toString("MM")que mostra, existem mais possibilidades do que apenas "MM".
DateTimeZoneobjeto 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 Monthclasse é 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.