Java 如何使用Joda时间表示部分间隔?
我有一些关于开放时间的数据,我想用Joda Time来表示 一天中典型的开放时间如下所示: 从9点开到12点,从13点开到20点。 我在Joda时间实体中表示它们的主要原因是验证它们:Java 如何使用Joda时间表示部分间隔?,java,jodatime,Java,Jodatime,我有一些关于开放时间的数据,我想用Joda Time来表示 一天中典型的开放时间如下所示: 从9点开到12点,从13点开到20点。 我在Joda时间实体中表示它们的主要原因是验证它们: 检查开放时间是否有效(9点在12点之前,等等) 检查开放间隔是否重叠(“9-12和11-13”是非法的) 就API而言,Joda Time类具有执行此验证所需的方法,但时间间隔是日期-时间连续体中的一对实例。我想独立于绝对时间来表示它们,有点像两个LocalTime部分的间隔。这是可能的吗?这里有一个自定义时
- 检查开放时间是否有效(9点在12点之前,等等)
- 检查开放间隔是否重叠(“9-12和11-13”是非法的)
就API而言,Joda Time类具有执行此验证所需的方法,但时间间隔是日期-时间连续体中的一对实例。我想独立于绝对时间来表示它们,有点像两个LocalTime部分的间隔。这是可能的吗?这里有一个自定义时间间隔的尝试(与Gray评论的解决方案非常相似): 导入org.joda.time.*; 公共类时间间隔{ 私有静态最终瞬间常数=新瞬间(0); 私人最终本地时间从; 私人最终本地时间; 公共时间间隔(LocalTime-from、LocalTime-to){ this.from=from; 这个; } 公共布尔值isValid(){ 请尝试{return toInterval()!=null;} catch(IllegalArgumentException e){return false;} } 公共布尔重叠(TimeInterval TimeInterval){ 返回此.toInterval().overlaps(timeInterval.toInterval()); } /** *@return这表示为一个适当的间隔 *@to在from之前无效时抛出IllegalArgumentException */ private Interval()引发IllegalArgumentException{ 返回新的间隔(从.toDateTime(常量)到.toDateTime(常量)); } }
我想你已经提供了最好的答案,伙计。我将它实现为一个OpenTimeRange,有一个开始和结束
LocalTime
,然后有一个数组来指定一天的开放时间。是的,您需要自己编写这种间隔类。顺便说一句,您的toInterval()方法被破坏了,因为它获取当前瞬间两次(每次一次toDateTimeToday)。如果正好在午夜的每一边调用,它可能返回两个不同的日期(比赛条件)。感谢您的评论,Stephen。我更新了代码,使其总是在一个固定的日期上计算时间间隔。
import org.joda.time.*;
public class TimeInterval {
private static final Instant CONSTANT = new Instant(0);
private final LocalTime from;
private final LocalTime to;
public TimeInterval(LocalTime from, LocalTime to) {
this.from = from;
this.to = to;
}
public boolean isValid() {
try { return toInterval() != null; }
catch (IllegalArgumentException e) { return false;}
}
public boolean overlapsWith(TimeInterval timeInterval) {
return this.toInterval().overlaps(timeInterval.toInterval());
}
/**
* @return this represented as a proper Interval
* @throws IllegalArgumentException if invalid (to is before from)
*/
private Interval toInterval() throws IllegalArgumentException {
return new Interval(from.toDateTime(CONSTANT), to.toDateTime(CONSTANT));
}
}