Java: getMinutes і getHours


142

Як ви отримуєте Години та Хвилини з тих пір Date.getHoursі Date.getMinutesзастаріли? У прикладах, які я знайшов у пошуку Google, використовувались застарілі методи.


2
FYI, жахливі класи, які датують час, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

Відповіді:


171

Спробуйте використовувати Joda Time замість стандартних класів java.util.Date. Бібліотека часу Joda має набагато кращий API для обробки дат.

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

Перегляньте це питання щодо плюсів і мінусів використання бібліотеки Joda Time.

Joda Time також може бути включений до деякої майбутньої версії Java як стандартного компонента, див. JSR-310 .


Якщо вам потрібно використовувати традиційні класи java.util.Date та java.util.Calendar, зверніться за допомогою до їх JavaDoc ( java.util.Calendar та java.util.Date ).

Ви можете використовувати традиційні класи, як цей, для отримання полів із заданого екземпляра 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
Питання: Тепер, коли Java 8 розгорнулася з LocalDateTime, чи є причина, що вам слід використовувати Joda Time за LocalDateTime?
щебетати

@Chrips Думки відрізняються. Joda-Time офіційно рекомендує замість цього використовувати java.time.
Оле ВВ

96

Від Javadoc для Date.getHours

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

Тож використовуйте

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

і еквівалент getMinutes.


6
Отже ... як це працює, якщо я хочу отримати години від дати, яка не відповідає зараз?
Майкл


Цей жахливий клас був витіснений роками тому сучасними класами java.time , з прийняттям JSR 310. Використовуйте ZonedDateTimeзамість цього.
Василь Бурк

58

java.time

Поки я фанат Joda-Time , Java 8 представляє пакет java.time, який, нарешті, є гідним стандартним рішенням Java! Прочитайте цю статтю, Дата і час Java SE 8 , щоб отримати велику кількість інформації про java.time поза годин і хвилин.

Зокрема, подивіться на LocalDateTimeклас.

Години і хвилини:

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

4
Це найкраща відповідь. Ви можете надати явну тимчасову зону , щоб нагадати читач і себе , що це тимчасова зона чутливої діяльність: LocalDateTime.now(ZoneId.of("Asia/Manilla")). Прочитайте now()лише один раз для узгодженості (пройде час між двома дзвінками). Якщо дата справді не має значення, LocalTimeтеж працює.
Оле ВВ

1
Дякую за це. Я якось ВІДМОВИТИ цю чудову побудовану в класі давно!
щебетає

Коментар Оле В. В. правильний. Але ще краще, ZonedDateTimeскоріше використовуйте клас LocalDateTime. Коли LocalDateTimeви відкидаєте цінну інформацію про часовий пояс без причини, нічого не отримуючи.
Василь Бурк

Корисно, якщо вам не потрібно бути сумісними назад. На жаль, це не підходить, якщо ви пишете для Android та підтримуєте більш старі версії API (або в будь-якому іншому випадку, коли Java 8 не завжди доступний).
M_M

@M_M Для Java - 6 і 7, велика частина java.time функціональності назад перенесений в ThreeTen-Backport бібліотеці. Далі адаптовано до раннього Android у ThreeTenABP . Для посилань див. Останній розділ моєї відповіді .
Василь Бурк

36

По-перше, імпортуйте java.util.Calendar

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

12

тл; д-р

ZonedDateTime.now().getHour()

… Або…

LocalTime.now().getHour() 

ZonedDateTime

Відповіді на цей питання JD добре , але не є оптимальним. Ця відповідь використовує LocalDateTimeклас. Відсутність будь-якої концепції часового поясу або зміщення від UTC, цей клас не може представляти момент.

Краще використовувати ZonedDateTime.

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

Вкажіть часовий пояс

Якщо ви опустите ZoneIdаргумент, він застосовується неявно під час виконання, використовуючи поточний часовий пояс JVM за замовчуванням.

Отже це:

ZonedDateTime.now()

… Те саме, що і це:

ZonedDateTime.now( ZoneId.systemDefault() )

Краще бути чітким, минаючи бажаний / очікуваний часовий пояс. За замовчуванням під час виконання може змінитися будь-який момент .

Якщо це критично, підтвердьте часовий пояс із користувачем.

Годинна хвилина

Допитуйтеся ZonedDateTimeпротягом години та хвилини.

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

LocalTime

Якщо ви хочете просто час доби без часового поясу, витягніть LocalTime.

LocalTime lt = zdt.toLocalTime() ;

Або пропустити ZonedDateTimeповністю, переходячи безпосередньо до 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).

типи java.time

Таблиця типів класів дати-часу в сучасному java.time порівняно зі спадщиною.


Про java.time

Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .

Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .

Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*заняттях.

Де отримати класи java.time?

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є доказом можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


6

Спробуйте каландр. Використовуйте getInstance, щоб отримати об'єкт календаря. Потім використовуйте setTime, щоб встановити необхідну дату. Тепер ви можете використовувати get (int поле) з відповідною константою, наприклад HOUR_OF_DAY, або для того, щоб прочитати потрібні вам значення.

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


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

Ці функції повернуть значення int за години та хвилини.


1
Дублікат. Цей підхід уже висвітлювався у відповіді JD .
Василь Бурк

Це java.sql.Time? Безумовно, немає жодних причин для того, щоб приносити цей застарілий клас в гру, коли у вас є java.time.LocalTime. Ти надмірно ускладнюєш.
Оле ВВ

Схоже, getMinutes()це було знято з використання (я використовую java 1.8) і замінено наCalendar.get(Calendar.MINUTE)
Saltz3

3

Ще один спосіб отримання хвилин і годин - це використання SimpleDateFormat.

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

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

FYI, жахливі класи, які датують час, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

2

Я рекомендую переглянути час joda ad. http://www.joda.org/joda-time/

Я побоювався додати ще одну бібліотеку до свого товстого проекту, але це просто легко і швидко, розумно і приголомшливо. Плюс до певної міри це добре грає з існуючим кодом.


1

Хоча я б не рекомендував це робити, я думаю, що варто зазначити, що хоча багато методів на java.util.Date застаріли, вони все ще працюють. У тривіальних ситуаціях може бути нормально їх використовувати. Крім того, java.util.Calendar є досить повільним, тому getMonth та getYear на Date можуть бути кориснішими швидше.


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

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

Це працює для мене


0

import java.util.*Ви можете вести час і хвилини, використовуючи календар та клас форматування. Calendar cal = Calendar.getInstance()і Formatter fmt=new Formatter()встановіть формат для відображення годин, хвилин fmt.format("%tl:%M",cal,cal)та System.out.println(fmt) показів друку10:12

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.