我现在有时间:
new Date();
我有一些小时常数,例如 23 和 8 (晚上11点或23点,早上8点或08点)。 我怎么知道现在是两小时常数之间的时间?
如果现在时间在两个小时之间,它需要运行一些程序代码才能运行,例如,如果它已经是晚上并且不是早上,那么不要运行一些代码。
这里的图片更好地解释:
无法启动静音模式的某些情况:
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!!
答案 0 :(得分:25)
试试这个
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);
答案 1 :(得分:11)
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
}
答案 2 :(得分:4)
现代方法是使用Java 8及更高版本内置的java.time类。许多功能都被反向移植到Java 6&amp; 7在ThreeTen-Backport项目中,并在ThreeTenABP项目中进一步适应Android。
时区在这里至关重要。对于任何特定时刻,日期和时间都按区域在世界各地变化。
ZoneId z = ZoneId.of( "America/Montreal" );
获取当前时刻。
ZonedDateTime zdt = ZonedDateTime.now( z );
提取时间。名称的Local
部分表示对象中包含 no 时区概念。
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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
更新:以上是本答复的更新版本。以下是旧的。
Joda-Time库远远优于java.util.Date和.Calendar类,用于日期工作。
时区对于确定一天中的时间至关重要。显然,“现在”在巴黎当天晚些时候比蒙特利尔要好。
定义一段时间通常最好是半开,[)
,其中开头是包容性的,但结尾是独占的。
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
Integer hour = now.getHourOfDay();
Boolean isNight = ( ( hour >= 23 ) && ( hour < 8 ) );
答案 3 :(得分:3)
我认为这是更清洁的解决方案,它的确有效。我用不同的时间参数测试了它。
/**
* @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);
}
答案 4 :(得分:2)
您可以使用Date.before
查看教程here,您可以使用Date.after
你也可以得到他的毫秒并进行比较。
答案 5 :(得分:0)
这是一个现在检查的功能(当前时间)介于两者之间 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;
}
答案 6 :(得分:0)
PHP解决方案
我无法在PHP中找到解决方案,但是@sytolk的答案有所帮助。这是PHP版本。
// $current = Date('H:i:s');
$current = "01:00:00";
$start = "23:00:00";
$end = "02:00:00";
$current = DateTime::createFromFormat('H:i:s', $current);
$start = DateTime::createFromFormat('H:i:s', $start);
$end = DateTime::createFromFormat('H:i:s', $end);
if ($end < $start) {
if ($current > $end) {
$end->modify('+1 day');
} else {
$start->modify('-1 day');
}
}
$inTime = $current > $start && $current < $end;
答案 7 :(得分:-1)
您还可以将输入字符串转换为整数,并将其与常量进行比较。这样您甚至不需要使用Calendar和Date对象。
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;
}
}