Java: getMinutes и getHours

146

Как вы получаете часы и минуты , так Date.getHoursи Date.getMinutesполучил осуждается? В примерах, которые я нашел в поиске Google, использовались устаревшие методы.

каток. сопровождающий.6
источник
2
К вашему сведению, ужасно неприятные классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormat, теперь унаследованы , вытеснены классами java.time, встроенными в Java 8 и более поздних версий . См. Учебник Oracle .
Basil

Ответы:

175

Попробуйте использовать Joda Time вместо стандартных классов java.util.Date. Библиотека Joda Time имеет гораздо лучший 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
@Chrips Мнения расходятся. Joda-Time официально рекомендует вместо этого использовать java.time.
Ole VV
99

Из 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вместо него.
Basil
58

java.time

Хотя я являюсь поклонником Joda-Time , в Java 8 представлен пакет java.time , который, наконец, стал стоящим стандартным решением Java! Прочтите эту статью, Java SE 8 Date and Time , чтобы получить хорошее количество информации о java.time за пределами часов и минут.

В частности, посмотрите на LocalDateTimeкласс.

Часы и минуты:

LocalDateTime.now().getHour();
LocalDateTime.now().getMinute();
JD
источник
4
Это лучший ответ. Вы можете предоставить явную временную зону , чтобы напомнить читатель и себя , что это временная зона чувствительной деятельность: LocalDateTime.now(ZoneId.of("Asia/Manilla")). Прочтите now()только один раз для единообразия (между двумя вызовами пройдет время). Если дата действительно неактуальна, LocalTimeтоже работает.
Ole VV
1
Спасибо тебе за это. Я как-то долго ПРОИСХОДИЛА по этому замечательному встроенному классу!
chrips
Комментарий Оле В.В. верен. Но даже лучше использовать ZonedDateTimeclass, а не LocalDateTime. С LocalDateTimeвы отбрасываете ценную информацию о часовом поясе без причины, ничего не получая.
Basil
Полезно, если вам не нужна обратная совместимость. К сожалению, не подходит, если вы пишете для Android и поддерживаете старые версии API (или в любом другом случае, когда Java 8 не всегда доступна).
M_M
@M_M Для Java 6 и 7 большая часть функциональных возможностей java.time перенесена в библиотеку ThreeTen-Backport . Дальнейшая адаптация к ранним версиям Android в ThreeTenABP . Ссылки см. В последнем разделе моего ответа .
Базиль Бурк,
37

Сначала импортируйте java.util.Calendar

Calendar now = Calendar.getInstance();
System.out.println(now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE));
Джеймс
источник
14

tl; dr

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 Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - 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

Попробуйте Calender. Используйте getInstance, чтобы получить объект календаря. Затем используйте setTime, чтобы установить требуемую дату. Теперь вы можете использовать get (int field) с соответствующей константой, например 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 .
Basil
Это что java.sql.Time? Конечно, нет никаких причин вводить в игру этот устаревший класс, когда он у вас есть java.time.LocalTime. Вы слишком усложняете.
Ole VV
Похоже 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())
Пака
источник
К вашему сведению, ужасно неприятные классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormat, теперь унаследованы , вытеснены классами java.time, встроенными в Java 8 и более поздних версий . См. Учебник Oracle .
Basil
2

Я бы рекомендовал посмотреть ad joda time. http://www.joda.org/joda-time/

Я боялся добавить еще одну библиотеку в свой толстый проект, но это просто, быстро, умно и круто. Кроме того, в некоторой степени он хорошо сочетается с существующим кодом.

Аламар
источник
1

Хотя я бы не рекомендовал это делать, я думаю, стоит отметить, что, хотя многие методы в java.util.Date устарели, они все еще работают. В тривиальных ситуациях их можно использовать. Кроме того, java.util.Calendar работает довольно медленно, поэтому getMonth и getYear on 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

Бенджамин
источник