Как получить миллисекунды до следующего часа - PullRequest
0 голосов
/ 02 октября 2018

Я хочу от миллисекунд до следующих часов.Например,

Текущее время -> 10:01:23 2 октября 2018 г. Требуются оставшиеся миллисекунды до 11:00:00 2 октября 2018 г.

Текущее время динамично, оно можетбудет 23:56:56 2 октября 2018 года, а следующий час в 00:00:00 3 октября 2018 года.

Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(startDate.getMillis());
    calendar.add(Calendar.HOUR, 1);

Я пытался что-то вроде этого, но он добавляет 1 час к startDate,Но я хочу точно следующий час.

Любая помощь приветствуется.

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

A java.time решение с использованием ZonedDateTime.until:

ZonedDateTime startDate = ZonedDateTime.now();
LocalDateTime nextHour = startDate.plusHours(1).truncatedTo(ChronoUnit.HOURS);
long msUntillNextHour = startDate.until(nextHour, ChronoUnit.MILLIS);
0 голосов
/ 02 октября 2018

Простой арифметический подход:

long hourInMillis = 60 * 60 * 1000;
long startDateInMillis = startDate.getMillis();
long millisSinceLastHourChange = startDateInMillis % hourInMillis;
long millisToNextHourChange = hourInMillis - millisSinceLastHourChange;

работает с Java 1; -)

EDIT
Этот подход не учитывает DST или подобные изменения.

0 голосов
/ 15 октября 2018

tl; др

Часы на часах не всегда час.

Использование часового пояса для обработки таких случаев.

Duration
.between(
    zonedDateTime_Now ,
    zonedDateTime_FirstMomentOfHourLater 
)
.toMillis()

Остерегайтесь аномалий

Если вы хотите учесть реальные аномалии во времени настенных часов, используемыеваш предполагаемый часовой пояс, вы должны указать часовой пояс.Это означает использование класса ZonedDateTime.

Час не всегда час.Например, Северная Корея недавно скорректировала свое смещение от UTC на полчаса .Это означает, что один час будет длиться всего 30 минут во время перестройки.Этот пример Северной Кореи является лишь одним из самых последних примеров.Политики всего мира демонстрируют удивительную склонность к пересмотру своего часового пояса.

Часовой пояс

Укажите правильное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 2-4 буквенные сокращения, такие как EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

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

Добавить час.

ZonedDateTime hourLater = now.plusHours( 1 ) ;

Усечь до часа.

ZonedDateTime firstMomentOfNextHour = hourLate.truncatedTo( ChronoUnit.HOURS ) ;

Истекшее время

Рассчитать прошедшее время как Duration объект.

Duration d = Duration.between( now , firstMomentOfNextHour ) ;

java.time классы используют наносекундное разрешение, но вы просили миллисекунды.Итак, поймите, что в отчетных миллисекундах участвуют потери данных.

long milliseconds = d.toMillis() ;

О java.time

java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

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

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации пакета Android для java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 02 октября 2018

Начиная с Java8, вы можете использовать java.time.LocalDateTime:

    LocalDateTime start = LocalDateTime.now();
    // Hour + 1, set Minute and Second to 00
    LocalDateTime end = start.plusHours(1).truncatedTo(ChronoUnit.HOURS);

    // Get Duration
    Duration duration = Duration.between(start, end);
    long millis = duration.toMillis();

Работает только сейчас (2018-10-02T18: 44: 48.943070 Peking time) Я получил 911 056 миллисекунд.

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