Java: getMinutes i getHours

142

Jak można uzyskać godziny i minuty od Date.getHoursi Date.getMinutesgot przestarzałe? Przykłady, które znalazłem w wyszukiwarce Google, wykorzystywały przestarzałe metody.

rink.attendant.6
źródło
2
FYI, strasznie kłopotliwe klasy daty i czasu, takie jak java.util.Date, java.util.Calendari java.text.SimpleDateFormatsą teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .
Basil Bourque

Odpowiedzi:

171

Spróbuj użyć Joda Time zamiast standardowych klas java.util.Date. Biblioteka Joda Time ma znacznie lepsze API do obsługi dat.

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

Zobacz to pytanie, aby poznać zalety i wady korzystania z biblioteki Joda Time.

Joda Time może być również dołączony do niektórych przyszłych wersji Java jako standardowy komponent, patrz JSR-310 .


Jeśli musisz używać tradycyjnych klas java.util.Date i java.util.Calendar, zapoznaj się z ich dokumentami JavaDoc ( java.util.Calendar i java.util.Date ).

Możesz użyć tradycyjnych klas, takich jak ta, aby pobrać pola z danej instancji 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!
Juha Syrjälä
źródło
2
Pytanie: Teraz, gdy Java 8 została wdrożona z LocalDateTime, czy jest jakiś powód, dla którego należy używać Joda Time zamiast LocalDateTime?
chrips
@Chrips Opinie różnią się. Joda-Time oficjalnie zaleca zamiast tego używanie java.time.
Ole VV
96

Z Javadoc dla Date.getHours

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

Więc użyj

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

i odpowiednik dla getMinutes.

znak
źródło
6
Więc ... jak to działa, jeśli chcę uzyskać godziny z daty, która nie odpowiada teraz?
Michael,
Ta okropna klasa została wyparta wiele lat temu przez nowoczesne klasy java.time , wraz z przyjęciem JSR 310. Użyj ZonedDateTimezamiast tego.
Basil Bourque
58

java.time

Chociaż jestem fanem Joda-Time , Java 8 wprowadza pakiet java.time , który jest wreszcie wartościowym standardowym rozwiązaniem Java! Przeczytaj ten artykuł, Java SE 8 Date and Time , aby uzyskać dużo informacji na temat java.time poza godzinami i minutami.

W szczególności spójrz na LocalDateTimeklasę.

Godziny i minuty:

LocalDateTime.now().getHour();
LocalDateTime.now().getMinute();
JD
źródło
4
To najlepsza odpowiedź. Może chcesz, aby zapewnić wyraźny strefę czasową, aby przypomnieć czytelnikowi, i sobie, że jest to operacja wrażliwa strefa czasu: LocalDateTime.now(ZoneId.of("Asia/Manilla")). Czytaj now()tylko raz, aby zachować spójność (między dwoma wywołaniami upłynie czas). Jeśli data jest naprawdę nieistotna, LocalTimeteż działa.
Ole VV
1
Dziękuję Ci za to. Jakoś przez długi czas Tęskniłem za tą wspaniałą konstrukcją w klasie!
chrips
Komentarz Ole VV jest poprawny. Ale jeszcze lepiej, użyj ZonedDateTimeklasy zamiast LocalDateTime. Dzięki LocalDateTimeTobie bez powodu odrzucasz cenne informacje o strefie czasowej, nic nie zyskując.
Basil Bourque
Przydatne, jeśli nie musisz być kompatybilny wstecz. Niestety nie nadaje się, jeśli piszesz dla Androida i obsługujesz starsze wersje API (lub w jakimkolwiek innym przypadku, gdy Java 8 nie zawsze jest dostępna).
M_M
@M_M W przypadku języka Java 6 i 7 większość funkcji java.time jest przenoszona z powrotem w bibliotece ThreeTen-Backport . Dalsze dostosowanie do wczesnego Androida w ThreeTenABP . Linki znajdziesz w ostatniej sekcji mojej odpowiedzi .
Basil Bourque
36

Najpierw zaimportuj java.util.Calendar

Calendar now = Calendar.getInstance();
System.out.println(now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE));
James
źródło
12

tl; dr

ZonedDateTime.now().getHour()

… Lub…

LocalTime.now().getHour() 

ZonedDateTime

Odpowiedz przez JD jest dobra, ale nie optymalne. Ta odpowiedź używa LocalDateTimeklasy. Bez jakiejkolwiek koncepcji strefy czasowej lub przesunięcia w stosunku do UTC, ta klasa nie może reprezentować momentu.

Lepiej używać ZonedDateTime.

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

Określ strefę czasową

Jeśli pominiesz ZoneIdargument, zostanie on zastosowany niejawnie w czasie wykonywania przy użyciu bieżącej domyślnej strefy czasowej maszyny JVM.

Więc to:

ZonedDateTime.now()

… Jest taki sam jak ten:

ZonedDateTime.now( ZoneId.systemDefault() )

Lepiej jest podać konkretną / oczekiwaną strefę czasową. Wartość domyślna może ulec zmianie w dowolnym momencie podczas działania.

Jeśli jest to krytyczne, potwierdź strefę czasową z użytkownikiem.

Godzina-minuta

Zapytaj ZonedDateTimeo godzinę i minutę.

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

LocalTime

Jeśli chcesz podać tylko porę dnia bez strefy czasowej, wyodrębnij LocalTime.

LocalTime lt = zdt.toLocalTime() ;

Lub ZonedDateTimecałkowicie pomiń , przechodząc bezpośrednio do 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).

typy java.time

Tabela typów klas daty i czasu we współczesnym java.time w porównaniu ze starszymi.


Informacje o java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, i SimpleDateFormat.

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .

Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*klas.

Skąd wziąć klasy java.time?

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .

Basil Bourque
źródło
6

Wypróbuj Calender. Użyj getInstance, aby uzyskać obiekt kalendarza. Następnie użyj setTime, aby ustawić wymaganą datę. Teraz możesz użyć get (pole int) z odpowiednią stałą, taką jak HOUR_OF_DAY lub coś podobnego, aby odczytać potrzebne wartości.

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

Tobias Langner
źródło
3
int hr=Time.valueOf(LocalTime.now()).getHours();
int minutes=Time.valueOf(LocalTime.now()).getMinutes();

Te funkcje będą zwracać wartości int w godzinach i minutach.

Nouran El Kassas
źródło
1
Duplikować. Takie podejście zostało już omówione w odpowiedzi JD .
Basil Bourque
Czy to jest java.sql.Time? Z pewnością nie ma żadnego powodu, aby wprowadzać do gry tę przestarzałą klasę, kiedy już masz java.time.LocalTime. Zbytnie komplikujesz.
Ole VV
Wygląda na to, getMinutes()że został wycofany w (używam Java 1.8) i został zastąpiony przezCalendar.get(Calendar.MINUTE)
Saltz3
3

Jeszcze jednym sposobem uzyskiwania minut i godzin jest użycie SimpleDateFormat.

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

SimpleDateFormat formatHours = new SimpleDateFormat("HH")
String getHours = formatHours.format(new Date())
Paka
źródło
FYI, strasznie kłopotliwe klasy daty i czasu, takie jak java.util.Date, java.util.Calendari java.text.SimpleDateFormatsą teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .
Basil Bourque
2

Poleciłbym poszukać czasu ad joda. http://www.joda.org/joda-time/

Bałem się dodać kolejną bibliotekę do mojego grubego projektu, ale jest to po prostu łatwe, szybkie, inteligentne i niesamowite. Ponadto do pewnego stopnia dobrze współgra z istniejącym kodem.

alamar
źródło
1

Chociaż nie polecałbym tego robić, myślę, że warto zauważyć, że chociaż wiele metod w java.util.Date zostało przestarzałych, nadal działają. W trywialnych sytuacjach ich użycie może być w porządku. Ponadto java.util.Calendar działa dość wolno, więc getMonth i getYear on Date mogą być pożyteczne szybciej.

skaffman
źródło
1
public static LocalTime time() {
    LocalTime ldt = java.time.LocalTime.now();

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

To działa dla mnie

Huey
źródło
0

import java.util.*Możesz uzyskać godziny i minuty, używając kalendarza i klasy formatera. Calendar cal = Calendar.getInstance()i Formatter fmt=new Formatter()ustawić format wyświetlania godzin i minut fmt.format("%tl:%M",cal,cal)oraz wydruków System.out.println(fmt) , takich jak10:12

Benzoes
źródło