Java: getMinutes e getHours

142

Como você recebe Horas e Minutos desde então Date.getHourse Date.getMinutesfoi preterido? Os exemplos que encontrei na pesquisa do Google usaram os métodos preteridos.

rink.attendant.6
fonte
2
FYI, os terrivelmente problemáticas aulas de data e hora, como java.util.Date, java.util.Calendar, e java.text.SimpleDateFormatsão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque

Respostas:

171

Tente usar o Joda Time em vez das classes java.util.Date padrão. A biblioteca Joda Time possui uma API muito melhor para lidar com datas.

DateTime dt = new DateTime();  // current time
int month = dt.getMonth();     // gets the current month
int hours = dt.getHourOfDay(); // gets hour of day

Veja esta pergunta para prós e contras do uso da biblioteca Joda Time.

O Joda Time também pode ser incluído em alguma versão futura do Java como componente padrão, consulte JSR-310 .


Se você deve usar as classes tradicionais java.util.Date e java.util.Calendar, consulte o JavaDoc para obter ajuda ( java.util.Calendar e java.util.Date ).

Você pode usar as classes tradicionais como esta para buscar campos de uma determinada instância de Data.

Date date = new Date();   // given date
Calendar calendar = GregorianCalendar.getInstance(); // creates a new calendar instance
calendar.setTime(date);   // assigns calendar to given date 
calendar.get(Calendar.HOUR_OF_DAY); // gets hour in 24h format
calendar.get(Calendar.HOUR);        // gets hour in 12h format
calendar.get(Calendar.MONTH);       // gets month number, NOTE this is zero based!
Juha Syrjälä
fonte
2
Pergunta: Agora que o Java 8 foi lançado com o LocalDateTime, existe algum motivo para você usar o Joda Time em vez do LocalDateTime?
Chrips #
Opiniões @Chrips diferem. A Joda-Time recomenda oficialmente o uso do java.time.
VV Ole Ole
96

Do Javadoc para Date.getHours

As of JDK version 1.1, replaced by Calendar.get(Calendar.HOUR_OF_DAY)

Então use

Calendar rightNow = Calendar.getInstance();
int hour = rightNow.get(Calendar.HOUR_OF_DAY);

e o equivalente para getMinutes.

Marca
fonte
6
Então ... como isso funciona se eu quiser obter as horas de uma Data que não corresponde agora?
Michael
Essa classe terrível foi substituída anos atrás pelas modernas classes java.time , com a adoção do JSR 310. Use em ZonedDateTimevez disso.
Basil Bourque
58

java.time

Enquanto eu sou fã do Joda-Time , o Java 8 apresenta o pacote java.time , que finalmente é uma solução padrão do Java que vale a pena! Leia este artigo, Data e hora do Java SE 8 , para obter uma boa quantidade de informações sobre java.time fora de horas e minutos.

Em particular, olhe para a LocalDateTimeclasse.

Horas e minutos:

LocalDateTime.now().getHour();
LocalDateTime.now().getMinute();
JD
fonte
4
Esta é a melhor resposta. Você pode querer fornecer fuso horário explícito para lembrar ao leitor e de si mesmo que esta é uma operação delicada fuso horário: LocalDateTime.now(ZoneId.of("Asia/Manilla")). Leia now()apenas uma vez para obter consistência (o tempo passará entre as duas chamadas). Se a data é realmente irrelevante, LocalTimetambém funciona.
Ole VV
1
Obrigado por isso. De alguma forma eu perdi esse maravilhoso construído em sala de aula por um longo tempo!
Chrips #
O comentário de Ole VV está correto. Mas, melhor ainda, use ZonedDateTimeclasse em vez de LocalDateTime. Com LocalDateTimevocê, você descarta informações valiosas de fuso horário sem motivo, sem nada ganho.
Basil Bourque
Útil se você não precisar ser compatível com versões anteriores. Lamentavelmente, não é adequado se você estiver escrevendo para Android e suportando versões mais antigas da API (ou em qualquer outro caso em que o Java 8 nem sempre esteja disponível).
M_M 23/07/19
@M_M Para Java 6 e 7, a maior parte da funcionalidade java.time é portada na biblioteca ThreeTen-Backport . Mais adaptado ao Android inicial no ThreeTenABP . Para obter links, consulte a última seção da minha resposta .
Basil Bourque 27/03
36

Primeiro, importe java.util.Calendar

Calendar now = Calendar.getInstance();
System.out.println(now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE));
James
fonte
12

tl; dr

ZonedDateTime.now().getHour()

... ou ...

LocalTime.now().getHour() 

ZonedDateTime

A resposta de JD é boa, mas não ótima. Essa resposta usa a LocalDateTimeclasse Na falta de qualquer conceito de fuso horário ou deslocamento do UTC, essa classe não pode representar um momento.

Melhor usar ZonedDateTime.

ZoneId z = ZoneID.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Especifique o fuso horário

Se você omitir o ZoneIdargumento, um será aplicado implicitamente no tempo de execução usando o fuso horário padrão atual da JVM.

Então, é isso:

ZonedDateTime.now()

… É o mesmo que isto:

ZonedDateTime.now( ZoneId.systemDefault() )

Melhor ser explícito, passando o fuso horário desejado / esperado. O padrão pode mudar a qualquer momento durante o tempo de execução.

Se crítico, confirme o fuso horário com o usuário.

Hora-minuto

Interrogue a ZonedDateTimehora e o minuto.

int hour = zdt.getHour() ;
int minute = zdt.getMinute() ;

LocalTime

Se você deseja apenas a hora do dia sem o fuso horário, extraia LocalTime.

LocalTime lt = zdt.toLocalTime() ;

Ou pule ZonedDateTimecompletamente, indo diretamente para LocalTime.

LocalTime lt = LocalTime.now( z ) ;  // Capture the current time-of-day as seen in the wall-clock time used by the people of a particular region (a time zone).

tipos java.time

Tabela de tipos de classes de data e hora no java.time moderno versus legado.


Sobre java.time

A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date, Calendar, e SimpleDateFormat.

Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .

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 de java.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 .

Basil Bourque
fonte
6

Experimente o Calender. Use getInstance para obter um Calender-Object. Em seguida, use setTime para definir a data necessária. Agora você pode usar get (int field) com a constante apropriada, como HOUR_OF_DAY ou mais, para ler os valores necessários.

http://java.sun.com/javase/6/docs/api/java/util/Calendar.html

Tobias Langner
fonte
3
int hr=Time.valueOf(LocalTime.now()).getHours();
int minutes=Time.valueOf(LocalTime.now()).getMinutes();

Essas funções retornarão valores int em horas e minutos.

Nouran El Kassas
fonte
1
Duplicado. Essa abordagem já foi abordada na resposta por JD .
Basil Bourque
É isso java.sql.Time? Certamente não há razão alguma para colocar em jogo essa classe desatualizada java.time.LocalTime. Você é muito complicado.
Ole VV
Looks como getMinutes()foi depreciado em (estou usando java 1.8) e foi substituído porCalendar.get(Calendar.MINUTE)
Saltz3
3

Mais uma maneira de obter minutos e horas é usando SimpleDateFormat.

SimpleDateFormat formatMinutes = new SimpleDateFormat("mm")
String getMinutes = formatMinutes.format(new Date())

SimpleDateFormat formatHours = new SimpleDateFormat("HH")
String getHours = formatHours.format(new Date())
Paka
fonte
FYI, os terrivelmente problemáticas aulas de data e hora, como java.util.Date, java.util.Calendar, e java.text.SimpleDateFormatsão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque
2

Eu recomendaria procurar tempo ad joda. http://www.joda.org/joda-time/

Eu tinha medo de adicionar outra biblioteca ao meu projeto espesso, mas é fácil, rápido, inteligente e incrível. Além disso, ele funciona bem com o código existente, até certo ponto.

alamar
fonte
1

Embora eu não recomende isso, acho que vale ressaltar que, embora muitos métodos em java.util.Date tenham sido preteridos, eles ainda funcionam. Em situações triviais, pode ser bom usá-las. Além disso, o java.util.Calendar é bastante lento, portanto, getMonth e getYear on Date podem ser úteis mais rapidamente.

skaffman
fonte
1
public static LocalTime time() {
    LocalTime ldt = java.time.LocalTime.now();

    ldt = ldt.truncatedTo(ChronoUnit.MINUTES);
    System.out.println(ldt);
    return ldt;
}

Isso funciona para mim

Huey
fonte
0

import java.util.*Você pode obter horas e minutos usando o calendário e a classe do formatador. Calendar cal = Calendar.getInstance()ee Formatter fmt=new Formatter()defina um formato para exibir horas e minutos fmt.format("%tl:%M",cal,cal)e os System.out.println(fmt) resultados da impressão , como10:12

Benjamin
fonte