Java 小于或等于Gregorianalendar
我的程序中有以下代码:Java 小于或等于Gregorianalendar,java,gregorian-calendar,Java,Gregorian Calendar,我的程序中有以下代码: if (expire.after(start) && expire.before(end)) //do somethig 但此代码不包括绑定日。 我的意思是,例如,如果开始日期为2014/01/15,结束日期为2014/01/20,到期日期为2014/01/20,则不考虑到期。如何解决 我试着这样做: if (expire.after(start) && (expire.equals(end) || expire.before(e
if (expire.after(start) && expire.before(end))
//do somethig
但此代码不包括绑定日。
我的意思是,例如,如果开始日期为2014/01/15,结束日期为2014/01/20,到期日期为2014/01/20,则不考虑到期。如何解决
我试着这样做:
if (expire.after(start) && (expire.equals(end) || expire.before(end)))
但是它不起作用,我得到了相同的结果。当我过去做时间检查时,我总是只在
之后和之前使用,即使我有一个范围检查是开始或
if((expire.compareTo(start)>=0)和&(expire.compareTo(end)0如@assylias所述,您可以尝试!expire.after(end)
,但这可能还不够。如果改用expire.equals(end)
然后您必须记住,这不仅仅是一个时间比较!在这里您还可以比较时区信息,甚至是区域设置等。一般来说,仅将GregorianCalendar用于日期比较并不好,因为这种类型也知道毫秒是时间部分。因此您可能需要手动设置整个时间p如果将所有三个日历实例设为零(午夜,不考虑时区异常,如在巴西的特定日期),或者更好,您应该提取日期信息,并使用以下工具比较这些细节:
public class DateComparator implements Comparator<GregorianCalendar> {
public int compare(GregorianCalendar gcal1, GregorianCalendar gcal2) {
int y1 = gcal1.get(Calendar.YEAR);
int y2 = gcal2.get(Calendar.YEAR);
if (y1 != y2) {
return y1 - y2;
}
int m1 = gcal1.get(Calendar.MONTH);
int m2 = gcal2.get(Calendar.MONTH);
if (m1 != m2) {
return m1 - m2;
}
return gcal1.get(Calendar.DATE) - gcal2.get(Calendar.DATE);
}
}
公共类DateComparator实现Comparator{
公共整数比较(GregorianCalendar gcal1、GregorianCalendar gcal2){
int y1=gcal1.get(日历年);
int y2=gcal2.get(日历年);
如果(y1!=y2){
返回y1-y2;
}
int m1=gcal1.get(日历月);
int m2=gcal2.get(日历月);
如果(m1!=m2){
返回m1-m2;
}
返回gcal1.get(Calendar.DATE)-gcal2.get(Calendar.DATE);
}
}
但是,在比较日期部分时,请确保始终具有相同的时区。
否则,您可以尝试提供该类型的JodaTime。新Java 8中也包含类似的仅日期类型。我最终解决了调整开始日期和结束日期的问题,使其超出所需范围的范围
例如,如果开始日期是2014/01/15,我将其设置为2014/01/14,如果结束日期是2014/01/20,我将其设置为2014/01/21。通过这些值,我可以使用.after和.before方法,而不会出现问题
感谢DwB的建议,并感谢大家的大力支持!tl;dr
仅用于日期值
( ! ( myLocalDate.isBefore( start ) ) // Is target date NOT before the start (meaning, is the target equal to or later than
&&
myLocalDate.isBefore( stop )
…或者更好的是:
org.threeten.extra.LocalDateRange.of( // Half-Open range.
LocalDate.of( 2014 , Month.JANUARY , 15 ) , // Inclusive.
LocalDate.of( 2014 , Month.JANUARY , 20 ) // Exclusive.
).contains(
LocalDate.of( 2014 , Month.JANUARY , 11 )
)
假的
GregorianCalendar
是一个麻烦的过时类。请避免使用它
细节
我不理解您的业务问题的逻辑,但是这个示例代码可能会有所帮助
我相信你会发现,在“半开放”方法中使用时间跨度效果最好。跨度的开始是包容性的,结束是排他性的。有关更多讨论,请参阅此图表
java.time
下面是一些使用java 8和更高版本中内置的现代java.time类的代码
LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区
时区对于确定日期至关重要。对于任何给定的时刻,全球各地的日期都因区域而异。例如,年午夜后几分钟是新的一天,而年仍然是“昨天”
如果未指定时区,JVM将隐式应用其当前默认时区。该默认时区可能随时更改,因此结果可能会有所不同。最好将所需/预期时区显式指定为参数
请以大陆/地区
的格式指定一个,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)
如果要使用JVM的当前默认时区,请请求该时区并将其作为参数传递。如果省略,则会隐式应用JVM的当前默认时区。最好是显式的,因为JVM内任何应用程序的任何线程中的任何代码都可能在运行时随时更改默认时区
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
或者指定一个日期。您可以通过数字设置月份,1-12月份的数字为1-12
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者,更好的方法是使用预定义的枚举对象,一年中每个月一个。提示:在整个代码库中使用这些month
对象,而不仅仅是一个整数,以使您的代码更具自文档性,确保有效值,并提供有效的数据
比较日期
LocalDate
类提供了比较方法:isBefore
,isAfter
,isEqual
,equals
,以及compareTo
从你的问题中不太清楚你的比较规则是什么。但我猜你缺少使用!
运算符表示“Not”条件的概念
使用半开放式方法,我们想询问目标日期是否“等于或晚于开始日期,且在结束之前”
一种简短的提问方式“等于或晚于”is“is not before”
范围对象
将库添加到项目中以访问该类。它将时间范围定义为一对LocalDate
对象。该类提供了方便的方法,如邻接
,包含
,交叉
,等等。它使用半开放方法
LocalDateRange range = LocalDateRange.of( start , stop ) ;
boolean rangeContainsTarget = range.contains( target ) ;
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为
从哪里获得java.time类
- ,及以后
- 内置的
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都是后端口的
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
LocalDate start = LocalDate.of( 2014 , Month.JANUARY , 15 ) ;
LocalDate stop = LocalDate.of( 2014 , Month.JANUARY , 20 ) ;
boolean rangeContainsTarget = ( ld.isEqual( start ) || (ld.isAfter( start ) ) && ld.isBefore( stop ) ; // Half-Open test, the long-way. "is equal to or later than the beginning AND before than ending"
boolean rangeContainsTarget = ( ! ( ld.isBefore( start ) ) && ld.isBefore( stop ) ; // Half-Open test, the long-way. "is not before the beginning AND before than ending"
LocalDateRange range = LocalDateRange.of( start , stop ) ;
boolean rangeContainsTarget = range.contains( target ) ;