我正在尝试在Java中创建一个方法,如果当前时间介于设置的时间间隔(startTime和endTime)之间,则返回true。
日期无关紧要。这样做的最佳方式是什么?
这是我的尝试,它不起作用:
public boolean isNowBetweenDateTime()
{
final Date now = new Date();
return now.after(startTime) && now.before(endTime);
}
检查时间是否在两个Date对象中,忽略年,月的最佳方式(在java中)是什么?
答案 0 :(得分:3)
您的代码看起来不错。只需将now
,startTime
和endTime
的日期设置为某个硬编码值。
答案 1 :(得分:1)
Interval.of( start.toInstant() , stop.toInstant() ).contains( Instant.now() )
在日期时间处理中,半开放式方法通常用于定义时间跨度。开头是包含,而结尾是独占。因此,一周定义为从星期一的第一个时刻开始,直到但不包括,即下一个星期一的第一个时刻。我们有时会直观地使用这种半开放式方法,午餐时间为12比1意味着从中午开始,但在时钟到达下午1点之前回到你的工作或班级。在整个日期工作中始终如一地使用半开放式将使逻辑和编程更清晰,更清晰,更简单。
所以你的逻辑应该是,“现在不是开始之前现在是结束之前”。请注意,“不在之前”是一种紧凑的说法“等于OR就在之后”。
boolean isNowBetweenDateTime = ( ! now.before(startTime) ) && now.before(endTime) ; // Not before start AND is before stop.
ZonedDateTime
问题和其他答案使用现在由java.time类取代的麻烦的旧遗留日期时间类。
ZonedDateTime
类表示时间轴上具有指定时区的时刻。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( z );
ZonedDateTime start = now.minusWeeks( 1 ); // Simulating input.
ZonedDateTime stop = now.plusWeeks( 2 ); // Simulating input.
你可以自己编写逻辑来测试现在是否介于。
之间Boolean isBetween = ( ! now.isBefore( start ) ) && stop.isBefore( stop );
Interval
如果要做更多这类工作,请查看ThreeTen-Extra项目。该库使用其他功能扩展了java.time类。具体而言,Interval
类将有所帮助,代表时间轴上的一对时刻。实现各种比较方法,例如contains
,encloses
,abuts
和overlaps
。
使用一对Instant
对象实例化Interval
。 Instant
代表UTC中时间轴上的一个时刻。我们可以从每个ZonedDateTime
对象中提取Instant
个对象。
Interval interval = Interval.of( start.toInstant() , stop.toInstant() );
Boolean isBetween = interval.contains( now.toInstant() ); // Or pass `Instant.now()`.
您还可以通过Instant.now()
调用Instant
获取当前时刻。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。
答案 2 :(得分:0)
首先,我建议使用Calendar而不是Date。我之前遇到过一些问题,使用日期。 我会用毫秒来比较日期,这是最安全的方法。代码似乎是这样的:
Date now = new Date();
long startTimeInMillis = startTime.getTime();
long endTimeInMillis = endTime.getTime();
return now.getTime >= startTimeInMillis && now.getTime < endTimeInMillis;
答案 3 :(得分:0)
如果您想忽略日期并且只考虑一天中的时间,请考虑使用Joda-Time的LocalTime
,它专门用于保存时间部分。
以下是一个例子:
java.util.Date startTime = ... ;
java.util.Date endTime = ... ;
public boolean isNowBetweenDateTime()
{
// get current time
final LocalTime now = new LocalTime();
// convert the java.util.Dates to LocalTimes and then compare
return now.isAfter(LocalTime.fromDateFields(startTime)) &&
now.isBefore(LocalTime.fromDateFields(endTime));
}
答案 4 :(得分:0)
如果当前时间介于两个其他时间之间,则此java函数返回true。它会忽略年/月/日。
import java.text.*;
import java.util.Date;
public static boolean isNowBetweenHours() throws ParseException
{
String leftBoundaryHours = "01:00:00"; //01:00 hours, military time.(1AM)
String rightBoundaryHours = "14:00:00"; //14:00 hours, military time.(2PM)
//returns true if current time is between
//leftBoundaryHours and rightBoundaryHours.
//This formatter converts a bare string to a date.
DateFormat formatter = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
//add the hand specified time to 1970-01-01 to create left/right boundaries.
Date leftTimeBoundary = formatter.parse("1970-01-01 " + leftBoundaryHours);
Date rightTimeBoundary = formatter.parse("1970-01-01 " + rightBoundaryHours);
//extract only the hours, minutes and seconds from the current Date.
DateFormat extract_time_formatter = new SimpleDateFormat("HH:mm:ss");
//Get the current time, put that into a string, add the 1970-01-01,
Date now = formatter.parse("1970-01-01 " +
extract_time_formatter.format(new Date()));
//So it is easy now, with the year, month and day forced as 1970-01-01
//all you do is make sure now is after left, and now is before right.
if (now.after(leftTimeBoundary) && now.before(rightTimeBoundary))
return true;
else
return false;
}
调用如下函数:
try {
System.out.println(isNowBetweenHours());
} catch (ParseException e) {
}
如果当前时间在01:00
小时之后但在14:00 hours
之前,则返回true。否则它返回false。