Сравнение времени и времени операций в Java - PullRequest
3 голосов
/ 28 января 2011

Здравствуйте, я хочу создать приложение с другим поведением, если это утро, полдень, день, вечер.Теперь я хочу установить некоторые переменные со временем для каждого. Например, полдень = 12:00. Теперь я хочу сравнить текущее время с ними и посмотреть, например, наступило ли утро, и посчитать, сколько до 12:00 - текущего времени.Сейчас я видел несколько примеров с разными датами, но я хочу сравнить только по часам.

Ответы [ 4 ]

2 голосов
/ 29 марта 2016

tl; dr

if ( 
    LocalTime.now( ZoneId.of( "Africa/Tunis” ) )
             .isBefore( LocalTime.of( 12 , 0 ) )
) {
    … // Do morning stuff. 
}

java.time

Другие ответы были правильными, но использовались устаревшие классы.Классы java.util.Date / .Calendar были вытеснены структурой java.time , встроенной в Java 8 и более поздние версии.

Класс LocalTime представляет время суток бездата и без часового пояса.

Создайте некоторые константы для вашего определения «утро», «день» и так далее.В реальной работе я бы использовал перечисление.Но я буду использовать здесь простую переменную для демонстрации.

LocalTime noon = LocalTime.of( 12 , 0 );

Часовой пояс имеет решающее значение для интерпретации времени суток.Время дня имеет значение только в контексте определенного часового пояса.Если он не указан, текущий часовой пояс JVM по умолчанию будет автоматически применяться автоматически.Я настоятельно рекомендую вам вместо этого всегда явно указывать желаемый / ожидаемый часовой пояс.Вы можете думать о ZonedDateTime как о комбинации Instant плюс часовой пояс (ZoneId).

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );

Мы можемизвлечь LocalTime из ZonedDateTime в соответствии с назначенным часовым поясом.

LocalTime nowLocalTime = now.toLocalTime();

Сравнить с заданным временем.

Boolean isMorning = nowLocalTime.isBefore( noon );

Использовать Duration*Класс 1038 * для представления промежутка времени в виде общего количества секунд плюс доля секунды в наносекундах.

ZonedDateTime todayNoon = now.adjustInto( noon );
Duration untilNoon = Duration.between( now , todayNoon );

Вывод по умолчанию Duration::toString представляет собой строку вформат, определенный ISO 8601 .Пример PT38M2S, который тридцать восемь минут и две секунды.Вы также можете запросить количество минут и т. Д.

Получив объект Duration от ZonedDateTime, мы получим точный результат с учетом таких аномалий, как летнее время (DST).Если вы предпочитаете использовать общий 24-часовой расчет дня, передайте объекты LocalTime в Duration.between.

2 голосов
/ 28 января 2011
    Calendar cal=GregorianCalendar.getInstance();

    int hour = cal.get(Calendar.HOUR);

Затем сравните час.

Это будет работать для вашего местного часового пояса

2 голосов
/ 28 января 2011

Вы можете использовать время joda hoursBetween или использовать класс календаря Java.Я бы рекомендовал использовать JodaTime.

  • Использование класса Java Calendar:

        Calendar future = Calendar.getInstance(); //future time
        future.set(Calendar.YEAR, 2011);
        future.set(Calendar.MONTH, 0);
        future.set(Calendar.DATE,27);
        future.set(Calendar.HOUR_OF_DAY,17);
        //get current time
        Calendar now = Calendar.getInstance();
        //time difference between now and future in hours
        long hoursDiff = (future.getTimeInMillis() - now.getTimeInMillis())/(60 * 60 * 1000);
        System.out.println("Difference in hours is ="+hoursDiff);//prints 2 since it's 3 pm here 
    

Это не учитывает экономию дневного света и сравнивает сваш местный часовой пояс.

  • Использование Joda Time hoursBetween:

    DateTime futureDate = new DateTime(future.getTime());
    DateTime current = new DateTime(now.getTime());
    int difference = Hours.hoursBetween(current,futureDate).getHours();
    System.out.println("Difference in hours is ="+difference);
    

Также посмотрите на этот вопрос и этот вопрос .

0 голосов
/ 28 января 2011

Вы можете использовать GregorianCalendar, чтобы сделать это. Создайте новый GregorianCalendar и установите месяц, день и год на некоторое постоянное значение. Установите время на любое интересующее вас время, например, 12:00. Теперь просто getTimeInMillis () и сохраните это значение. Позже вы можете создать еще один GregorianCalendar с версией без аргументов, чтобы узнать текущее время. Установите месяц, день и год к тому же постоянное значение, как ваш эталонного значения, а затем просто сравнить getTimeInMillis () еще раз, чтобы увидеть, если она раньше, равна, или после отсчета времени суток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...