Расписание, которое запускается каждый день в определенное время с чч: мм: сс - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь запускать код в определенное время каждый день, но с чч: мм: сс.Я специально пытаюсь запускать его в 17:00 по восточному поясному времени каждый день, поэтому необходимо учитывать часовые пояса.

Вот моя попытка, в котлине:

val timer = Timer()
val format = SimpleDateFormat("hh:mm:ss") 
val date = format.parse("11:07:09")
timer.schedule(object : TimerTask() {
    override fun run() {
       // code here
    }
}, date)

Я не смогчтобы это работало, и даже если бы я это сделал, я не уверен, как бы добавить к нему часовые пояса.

Как я могу это сделать?

1 Ответ

0 голосов
/ 13 сентября 2018

tl; др

java.util.Date
.from(
    ZonedDateTime.of( 
        LocalDate.now( ZoneId.of( "America/Montreal" )  ) , 
        LocalTime.parse( "11:07:09" ) , 
        ZoneId.of( "America/Montreal" ) 
    )
    .toInstant()
)

Подробности

A java.util.Date представляет дату с временем суток в UTC.

Вы проигнорировали дату и зону / смещение.

Ваш результат, по-видимому, по умолчанию равен 11:00 1 января 1970 года.

java.time

Кроме того, ужасные классы Date и SimpleDateFormat были вытеснены годыназад классами java.time .

Представляет ваше целевое время суток.

LocalTime lt = LocalTime.parse( "11:07:09" ) ;

Получить текущую дату, сегодняшнюю дату.Требуется часовой пояс.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;

Соедините их, чтобы определить момент.

ZonedDateTime zdt = ZonedDateTime.of( today , lt , z ) ;  // Time-of-day will be adjusted if not valid on that date in that zone. 

Настройте на UTC.Тот же самый момент, та же самая точка на временной шкале, другое время настенных часов.

Instant instant = zdt.toInstant() ;  // Adjust from zone to UTC.

Избегайте устаревших классов даты и времени.Но если вам необходимо взаимодействие, вы можете конвертировать туда и обратно, вызывая новые методы, добавленные к старым классам.

java.util.Date d = java.util.Date.from( instant ) ;

Вы, вероятно, захотите улучшить этот код, чтобы увидеть, прошел ли желаемый вами момент.Для сравнения используйте методы isAfter и isBefore.

Executors

Класс Timer был заменен платформой executor.Ищите в Oracle Java Tutorials и Stack Overflow, чтобы узнать больше.

С исполнителем вы можете запланировать выполнение задачи в определенный момент.Но вы делаете это косвенно, указывая период ожидания, а не время суток.Исполнитель планирования принимает аргумент для начальной задержки.Вы можете рассчитать эту задержку как промежуток времени между текущим моментом и требуемым моментом.

Чтобы рассчитать этот промежуток времени, используйте класс Duration.

Duration d = Duration.between( Instant.now() , instant ) ;

Имейте в виду, что вы не можете ожидать, что для выполнения ваших задач в течение доли секунды будет выполнено идеальное время.Планирование вашей JVM в хост-ОС и ваших Java-потоков в JVM может повлечь за собой задержки.

Конечно, вам также нужно будет записывать историю ваших задач после их завершения.Когда ваше приложение завершает работу, а затем перезапускается, оно должно изучить историю, чтобы выяснить, как настроить новое расписание.Эта проблема выходит за рамки этого ответа.Читайте о записи файлов, использовании базы данных или использовании какой-либо другой схемы persistence .


About java.time

The 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 .

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