Java: getMinutes e getHours


142

Come si ottengono ore e minuti da quando Date.getHourse sono Date.getMinutesstati deprecati? Gli esempi che ho trovato sulla ricerca di Google hanno utilizzato i metodi obsoleti.


2
Cordiali saluti, le classi data-ora terribilmente fastidiose come java.util.Date, java.util.Calendare java.text.SimpleDateFormatsono ormai legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

Risposte:


171

Prova a utilizzare Joda Time anziché le classi standard java.util.Date. La libreria Joda Time ha API molto migliori per la gestione delle date.

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

Vedi questa domanda per pro e contro dell'utilizzo della libreria Joda Time.

Joda Time potrebbe anche essere incluso in alcune versioni future di Java come componente standard, vedere JSR-310 .


Se è necessario utilizzare le classi java.util.Date e java.util.Calendar tradizionali, consultare i relativi JavaDoc ( java.util.Calendar e java.util.Date ).

È possibile utilizzare le classi tradizionali in questo modo per recuperare i campi da una determinata istanza di Date.

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!

2
Domanda: Ora che Java 8 è stato implementato con LocalDateTime, c'è qualche motivo per cui dovresti usare Joda Time su LocalDateTime?
Chrips

@Chrips Le opinioni differiscono. Joda-Time consiglia invece di utilizzare java.time.
Ole VV,

96

Da Javadoc per Date.getHours

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

Quindi usa

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

e l'equivalente per getMinutes.


6
Quindi ... come funziona se voglio ottenere le ore da una data che non corrisponde ora?
Michael,


Questa classe terribile è stata soppiantata anni fa dalle moderne classi java.time , con l'adozione di JSR 310. Utilizzare ZonedDateTimeinvece.
Basil Bourque

58

java.time

Mentre sono un fan di Joda-Time , Java 8 introduce il pacchetto java.time che è finalmente una soluzione standard Java utile! Leggi questo articolo, Java SE 8 Date and Time , per una buona quantità di informazioni su java.time al di fuori di ore e minuti.

In particolare, guarda la LocalDateTimeclasse.

Ore e minuti:

LocalDateTime.now().getHour();
LocalDateTime.now().getMinute();

4
Questa è la risposta migliore Si consiglia di fornire fuso orario esplicito per ricordare al lettore e voi stessi che si tratta di un'operazione delicata fuso orario: LocalDateTime.now(ZoneId.of("Asia/Manilla")). Leggere now()solo una volta per coerenza (il tempo passerà tra le due chiamate). Se la data è davvero irrilevante, LocalTimefunziona anche.
Ole VV,

1
Grazie per questo. Ho in qualche modo PERDUTO questa meravigliosa classe costruita da molto tempo!
Chrips

Il commento di Ole VV è corretto. Ma ancora meglio, usa la ZonedDateTimeclasse piuttosto che LocalDateTime. Con LocalDateTimete stai eliminando preziose informazioni sul fuso orario senza motivo, senza ottenere nulla.
Basil Bourque,

Utile se non devi essere retrocompatibile. Purtroppo non adatto se stai scrivendo per Android e supportando versioni API precedenti (o in qualsiasi altra istanza quando Java 8 non è sempre disponibile).
M_M,

@M_M Per Java 6 e 7, la maggior parte della funzionalità java.time è trasferita nella libreria ThreeTen-Backport . Adattato ulteriormente ai primi Android in ThreeTenABP . Per i collegamenti, vedere l'ultima sezione della mia risposta .
Basil Bourque,

36

Innanzitutto, importare java.util.Calendar

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

12

tl; dr

ZonedDateTime.now().getHour()

… o …

LocalTime.now().getHour() 

ZonedDateTime

La risposta di JD è buona ma non ottimale. Quella risposta usa la LocalDateTimeclasse. Mancando di qualsiasi concetto di fuso orario o offset da UTC, quella classe non può rappresentare un momento.

Meglio usare ZonedDateTime.

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

Specifica il fuso orario

Se si omette l' ZoneIdargomento, uno viene applicato implicitamente in fase di esecuzione utilizzando il fuso orario predefinito corrente della JVM.

Così questo:

ZonedDateTime.now()

... è uguale a questo:

ZonedDateTime.now( ZoneId.systemDefault() )

Meglio essere espliciti, passando il fuso orario desiderato / previsto. L'impostazione predefinita può cambiare in qualsiasi momento durante il runtime.

Se critico, confermare il fuso orario con l'utente.

Ora-minuto

Interroga il ZonedDateTimeper l'ora e il minuto.

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

LocalTime

Se si desidera solo l'ora del giorno senza il fuso orario, estrarre LocalTime.

LocalTime lt = zdt.toLocalTime() ;

O salta del ZonedDateTimetutto, andando direttamente a 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).

tipi di java.time

Tabella dei tipi di classi data-ora in java.time moderno rispetto a legacy.


Informazioni su java.time

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.

Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .

Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità 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, YearQuartere altro .



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

Queste funzioni restituiranno valori int in ore e minuti.


1
Duplicare. Questo approccio era già stato trattato nella risposta di JD .
Basil Bourque,

È quello java.sql.Time? Certamente non c'è motivo di mettere in gioco quella classe obsoleta quando ce l'hai java.time.LocalTime. Sei troppo complicato.
Ole VV,

Sembra che getMinutes()sia stato deprecato in (sto usando Java 1.8) ed è stato sostituito conCalendar.get(Calendar.MINUTE)
Saltz3,

3

Un altro modo per ottenere minuti e ore è utilizzare SimpleDateFormat.

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

SimpleDateFormat formatHours = new SimpleDateFormat("HH")
String getHours = formatHours.format(new Date())

Cordiali saluti, le classi data-ora terribilmente fastidiose come java.util.Date, java.util.Calendare java.text.SimpleDateFormatsono ormai legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

2

Consiglierei di cercare ad joda time. http://www.joda.org/joda-time/

Avevo paura di aggiungere un'altra libreria al mio grosso progetto, ma è semplice, veloce, intelligente e fantastico. Inoltre, gioca bene con il codice esistente, in una certa misura.


1

Anche se non consiglierei di farlo, penso che valga la pena sottolineare che, sebbene molti metodi su java.util.Date siano stati deprecati, funzionano ancora. In situazioni banali, potrebbe essere OK usarli. Inoltre, java.util.Calendar è piuttosto lento, quindi getMonth e getYear alla data potrebbero essere utilmente più veloci.


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

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

Questo funziona per me


0

import java.util.*Puoi ottenere ore e minuti usando il calendario e la classe di formattazione. Calendar cal = Calendar.getInstance()e Formatter fmt=new Formatter()impostare un formato per visualizzare l'ora e i minuti fmt.format("%tl:%M",cal,cal)e l' System.out.println(fmt) output di stampa mostra come10:12

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.