Получить разницу с текущим временем по Гринвичу до 21:00 по Гринвичу

Я запускаю задачу каждую минуту, я хочу распечатать разницу между текущим временем по Гринвичу и 9 вечера по Гринвичу, я хочу, чтобы это выполнялось все время, поэтому, как только оно достигнет 9 вечера по Гринвичу, оно будет сброшено до 24 часов, так что это выглядит в 9 вечера по Гринвичу следующего дня.

У меня установлена ​​библиотека jodatime.

Я пробовал, это получает текущее время по Гринвичу?

TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT");
        TimeZone.setDefault(gmtTimeZone);
        Calendar calendar = Calendar.getInstance(gmtTimeZone);

Теперь, чтобы получить 9 часов, я могу получить час?

if (calendar.get(Calendar.HOUR_OF_DAY); == 9) {

поэтому мой вопрос в том, как мне добраться до 9 вечера по Гринвичу? и красиво отформатируйте его в IE; 16 часов 15 минут и 4 секунды?

Спасибо.

Будет здорово, если вы также упомянете, что вы пробовали.

Abhishek Garg 16.07.2019 23:02

Привет! Это может помочь вам сформулировать важный вопрос. stackoverflow.com/help/как спросить Так мы сможем предоставить более качественную обратную связь!

IoCalisto 16.07.2019 23:04

Обновленный пост с тем, что у меня уже есть. @AbhishekGarg

JORDAN CARR 16.07.2019 23:08

У вас есть особое желание использовать Joda-Time? Спрашиваю, потому что «Joda-Time считается в значительной степени «законченным» проектом. Серьезных улучшений не планируется». (цитата из домашняя страница). Они рекомендуют: «Если вы используете Java SE 8, перейдите на java.time (JSR-310)». Вы можете, если используете Java 6 или 7.

Ole V.V. 17.07.2019 00:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используя Joda-Time, вы можете получить время до 9 вечера по Гринвичу, используя следующий вспомогательный метод:

import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;
import org.joda.time.Period;
import org.joda.time.format.PeriodFormat;
public static String timeUntil(int hourOfDay, int minuteOfHour) {
    Period period = Period.fieldDifference(LocalTime.now(DateTimeZone.UTC),
                                           new LocalTime(hourOfDay, minuteOfHour))
                          .plusHours(24).normalizedStandard().withDays(0).withMillis(0);
    StringBuffer buf = new StringBuffer();
    PeriodFormat.wordBased(Locale.US).printTo(buf, period);
    return buf.toString();
}

Тестовое задание

System.out.println(timeUntil(21, 0)); // until 9 pm GMT
System.out.println(timeUntil(22, 0)); // until 10 pm GMT

Пример вывода

23 hours, 31 minutes and 48 seconds
31 minutes and 48 seconds

Обратите внимание, что эта логика не обрабатывает летнее время, что не является проблемой для UTC/GMT, но может быть, если вы перейдете на использование другого часового пояса.

Andreas 16.07.2019 23:41

Я бы использовал методы библиотеки Java java.time вместо календаря, если вы используете по крайней мере Java 8. Они намного удобнее, и их сложнее непреднамеренно использовать неправильно.

// in a 24 hour clock, 9PM = 21:00
final int ninePM = 21;

OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
OffsetDateTime next9PM;
if (now.getHour() >= ninePM) {
    next9PM = now.plus(1, ChronoUnit.DAYS)
                 .withHour(ninePM)
                 .truncatedTo(ChronoUnit.HOURS);
} else {
    next9PM = now.withHour(ninePM)
                 .truncatedTo(ChronoUnit.HOURS);
}

return Duration.between(now, next9PM);

Спасибо за показ современного решения. Я сделал пару простых тестов: это работает.

Ole V.V. 17.07.2019 00:17

Другие вопросы по теме