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