我使用日历API来比较日期,如下所示:
Date date = DateHelper.getDate(stringDate) This returns a date object
Calendar atPtmtCalendar = Calendar.getInstance();
if(date != null){
atPtmtCalendar.setTime(date)
}
问题是,我目前正在检查变量日期是否为空值,而不是在PmtCalendar,因为:
if(date != null){
Boolean isBefore = atPtmtCalendar.before(otherCalendarDate)
}
有没有什么方法可以通过使用atPtmtCalendar来检查空值?
tl;dr
不可以,您不能使用可能为null的引用变量本身来查看它是否为null。您必须从变量外部进行检查。
Objects // Handle utility class.
.requireNonNull( myDate ) // Throws exception if reference variable holds no reference, is null.
.toInstant() // Convert from terrible legacy class `java.util.Date` to modern class `java.time.Instant`.
.isBefore( // Compare one `Instant` object to another.
Instant.now() // Capture the current moment as seen with an offset of zero hours-minutes-seconds from UTC.
) // Returns true or false.
避免使用传统日期时间类
CCD_ 1&Calendar
类存在严重缺陷。几年前,JSR310中定义的现代java.time类取代了它们。
java.time.Instant
当交给java.util.Date
对象时,立即转换为其替代对象java.time.Instant
。使用添加到旧类中的新转换方法。
Instant instant = myJavaUtilDate.toInstant() ;
要进行比较,请调用任何Instant
方法:equals
、isBefore
、isAfter
。
Null检查
至于检查null…如果对象引用(如Date
0(为null,则不能调用任何用于检查null的方法。因此,您的问题"有没有任何方法可以通过使用atPtmtCalendar来检查空值?"毫无意义。因此,您的null检查必须与使用可能为null的变量分开。
为了便于阅读,我更愿意直接用调用Objects.nonNull
来代替您的空检查。
if( null != myVar ) { … } // Not my favorite.
if( Objects.nonNull( myVar ) ) { … } // Preferred by me.
如果变量永远不应该为null,那么如果它确实为null,则抛出异常。要执行此操作,请调用Objects.requireNonNull
。也可以在异常中传递错误消息的文本。
if( Objects.requireNonNull( myVar ) ) { … }
如果null在您的特定场景中是合法值,那么您调用的方法应该返回一个Optional
。
Optional< Date > date = whatever.getDate() ;
然后,您的代码可以使用Optional
上几种方便的方法中的任何一种来处理丢失有效负载的情况。
示例代码
把所有这些放在一起:
boolean isPastDate =
Objects
.requireNonNull( myDate )
.toInstant()
.isBefore(
Instant.now()
)
;