Как узнать, есть ли сейчас время между двумя часами?
у меня сейчас времени:
new Date();
и у меня есть некоторые часовые константы, например,23 и 8 (это 11 вечера или 23: 00, 8 утра или 08: 00). Как я могу знать, что сейчас время между двумя часовыми константами?
ему нужно запустить какой-то код программы или не запускать, если сейчас время между двумя часами, например, не запускайте какой-то код, если его уже вечер и пока это не утро.
здесь изображение лучше объясните:
некоторые ситуации, когда беззвучный режим не срабатывает:
00:00 20.06.13 - 23:00 20.06.13 // after 23.00 can loud!!
23:00 20.06.13 - 15:00 20.06.13 // after 15.00 can loud!!
01:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!
21:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!
7 ответов
попробуй такое
int from = 2300;
int to = 800;
Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
int t = c.get(Calendar.HOUR_OF_DAY) * 100 + c.get(Calendar.MINUTE);
boolean isBetween = to > from && t >= from && t <= to || to < from && (t >= from || t <= to);
Calendar cal = Calendar.getInstance(); //Create Calendar-Object
cal.setTime(new Date()); //Set the Calendar to now
int hour = cal.get(Calendar.HOUR_OF_DAY); //Get the hour from the calendar
if(hour <= 23 && hour >= 8) // Check if hour is between 8 am and 11pm
{
// do whatever you want
}
java.время
современный способ - с java.занятия построены в Java 8 и выше. Большая часть функциональности обратно портирована на Java 6 & 7 в проекте ThreeTen-Backport и далее адаптирована к Android в проекте ThreeTenABP.
часовой пояс имеет решающее значение здесь. Для любого данного момента дата и время суток различаются по всему миру по зонам.
ZoneId z = ZoneId.of( "America/Montreal" );
получить текущий момент.
ZonedDateTime zdt = ZonedDateTime.now( z );
извлеките время суток. Этот Local
часть имени означает, что есть нет понятие часового пояса, содержащегося в объекте.
LocalTime lt = zdt.toLocalTime();
определите границы вечера.
LocalTime start = LocalTime.of( 23 , 0 ); // 11 PM.
LocalTime stop = LocalTime.of( 8 , 0 ); // 8 AM.
сравнить.
нам нужно выяснить, оседлаем ли мы новый день или в тот же день. А
LocalTime
не имеет понятия о дате, только один общий день 24 часов. Поэтому мы должны проверить, является ли начало до или после остановки, поскольку нам нужно другое сравнение алгоритм для каждого случая. И мы должны рассмотреть, если начало равна стоп, как это может быть особый случай, в зависимости от бизнес-правил.в работе даты и времени мы обычно определяем промежутки времени как полуоткрытые, где начало включительно хотя концовка эксклюзивные.
вот один из способов сделать это.
Boolean silentRunning = null ;
if( start.equals( stop ) ) {
silentRunning = Boolean.FALSE ;
} else if( stop.isAfter( start ) ) { // Example 3 PM to 6 PM.
silentRunning = ( ! lt.isBefore( start ) ) && lt.isBefore( stop ) ;
} else if ( stop.isBefore( start ) ) { // Example 11 PM to 8 AM.
silentRunning = ( lt.equals( start ) || lt.isAfter( start ) ) && lt.isBefore( stop ) ;
} else {
// Error. Should not reach this point. Paranoid check.
}
о Ява.время
на java.время framework встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
на Joda Времени, теперь режим обслуживания, советует миграция в java.время классы.
чтобы узнать больше, см. В Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.
где получить java.время занятий?
-
Java SE 8 и SE 9 и позже
- встроенный.
- часть стандартного API Java со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и зафиксировать.
-
Java SE 6 и SE 7
- большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
- Android
UPDATE: выше приведена более поздняя версия этого ответа. Ниже Старый.
Joda Времени
библиотека времени Joda значительно превосходит java.утиль.Сроки и. Классы календаря для работы с датой и временем.
часовой пояс имеет решающее значение для определить время суток. Очевидно, "сейчас" в Париже позднее, чем в Монреале.
определить диапазон времени, как правило, лучше всего сделать как полуоткрытый, [)
, где начало включено, но окончание является исключительным.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
Integer hour = now.getHourOfDay();
Boolean isNight = ( ( hour >= 23 ) && ( hour < 8 ) );
Я думаю, что это более чистое решение, и оно работает. Я протестировал его с различными временными параметрами.
/**
* @param fromHour Start Time
* @param toHour Stop Time
* @param now Current Time
* @return true if Current Time is between fromHour and toHour
*/
boolean isTimeBetweenTwoHours(int fromHour, int toHour, Calendar now) {
//Start Time
Calendar from = Calendar.getInstance();
from.set(Calendar.HOUR_OF_DAY, fromHour);
from.set(Calendar.MINUTE, 0);
//Stop Time
Calendar to = Calendar.getInstance();
to.set(Calendar.HOUR_OF_DAY, toHour);
to.set(Calendar.MINUTE, 0);
if(to.before(from)) {
if (now.after(to)) to.add(Calendar.DATE, 1);
else from.add(Calendar.DATE, -1);
}
return now.after(from) && now.before(to);
}
Вы можете увидеть учебник здесь С Date.before
и вы можете делать с Date.after
Также вы можете получить его миллисекунды и сравнить его.
вот функция, которая проверяет сейчас (текущее время) либо между 1 к 4 или 4 до 8 или 8 до 12 или 12 до 16 или 16 до 20 или 20 к 1 и возвращается в следующий раз.
private Calendar GetTimeDiff() throws ParseException {
Calendar now = Calendar.getInstance();
Calendar one = Calendar.getInstance();
one.set(Calendar.HOUR_OF_DAY, 1);
one.set(Calendar.MINUTE, 0);
one.set(Calendar.SECOND, 0);
Calendar four = Calendar.getInstance();
four.set(Calendar.HOUR_OF_DAY, 4);
four.set(Calendar.MINUTE, 0);
four.set(Calendar.SECOND, 0);
Calendar eight = Calendar.getInstance();
eight.set(Calendar.HOUR_OF_DAY, 8);
eight.set(Calendar.MINUTE, 0);
eight.set(Calendar.SECOND, 0);
Calendar twelve = Calendar.getInstance();
twelve.set(Calendar.HOUR_OF_DAY, 12);
twelve.set(Calendar.MINUTE, 0);
twelve.set(Calendar.SECOND, 0);
Calendar sixteen = Calendar.getInstance();
sixteen.set(Calendar.HOUR_OF_DAY, 16);
sixteen.set(Calendar.MINUTE, 0);
sixteen.set(Calendar.SECOND, 0);
Calendar twenty = Calendar.getInstance();
twenty.set(Calendar.HOUR_OF_DAY, 20);
twenty.set(Calendar.MINUTE, 0);
twenty.set(Calendar.SECOND, 0);
if(now.getTime().after(one.getTime()) && now.getTime().before(four.getTime())) {
return four;
}
if(now.getTime().after(four.getTime()) && now.getTime().before(eight.getTime())) {
return eight;
}
if(now.getTime().after(eight.getTime()) && now.getTime().before(twelve.getTime())) {
return twelve;
}
if(now.getTime().after(twelve.getTime()) && now.getTime().before(sixteen.getTime())) {
return sixteen;
}
if(now.getTime().after(sixteen.getTime()) && now.getTime().before(twenty.getTime())) {
return twenty;
}
if(now.getTime().after(twenty.getTime()) && now.getTime().before(one.getTime())) {
return one;
}
return now;
}
вы также можете преобразовать входную строку в целое число и сравнить ее с вашей константы. Таким образом, вам даже не нужно работать с объектами календаря и даты.
public class testDateRange {
static final int START_HOUR = 8;
static final int END_HOUR = 23;
public static void main(String[] args) {
String now_time = new SimpleDateFormat("HH:mm").format(new Date());
System.err.println(isInRange(Integer.parseInt(now_time.replace(":","")),START_HOUR*100,END_HOUR*100));
}
private static boolean isInRange(int now_time, int start_time, int end_time) {
if ((now_time>start_time)&&
(now_time<end_time) )
{
return true;
}
return false;
}
}