我是一名中级 Java 编码员,正在编写一个图书管理员 Java 应用程序,出于某种原因,我只是不知道是否应该使用dueDate.after(today)
ORdueDate.before(today)
方法来确定这本书是否过期。通过键入这两种方法,我得到了相当多的矛盾值。因此,我还假设我的代码中还有其他一些错误,所以如果你能确认哪个是正确的方法,那将是很好的,这样我就可以继续修复其他错误。
5 回答
您需要dueDate.before(today)
:截止日期在今天之前;到期日已过,因此该书已逾期。
如果你交换对象可能会更容易?你会明白today.after(dueDate)
,如果你大声读出来,它会突然变得很清楚:“如果今天是在截止日期之后,那么......”
请记住,before
andafter
方法执行<
(或>
)比较,而不是<=
(或>=
比较)。这就是 API 文档中“严格”一词的含义。
此外,JavaDate
对象实际上是一个瞬间,而不是人们通常认为的“日期”。也就是说,它不仅会比较一天,还会比较一天中的时间。
如果您只想比较当天而不检查当天的时间,请将所有到期日期创建为特定时间,例如午夜。例如,假设一本书的到期日为 10 月 26 日。到期日可能是 10 月 27 日午夜。
boolean overdue = !now.before(dueDate);
有点尴尬的否定解释了现在正好是 10 月 27 日凌晨 12:00 的情况。
dueDate.before(today)
将转换为发生在今天之前的书的实际到期日期,这意味着它实际上已过期。这可能是您想要的(假设您正在检查是否为真)
事情的另一面
dueDate.after(today)
将转换为今天之后发生的书的实际到期日期,这意味着它还没有过期。
!dueDate.after(today)
和之间的唯一区别dueDate.before(today)
是两个日期完全相同时的结果 - 大概一本书在到期日归还时没有过期,所以dueDate.before(today)
应该是正确的。
至于您未指定的其他问题:您是否知道它java.util.Date
代表毫秒精度的时间点,而不是日历日期?这意味着为了使用日历日期的比较方法,您必须确保在创建 Date 实例时将时间组件设置为零。问题的另一个原因可能是时区差异。
这取决于您想要达到的目标。借书时要设置的日期是dueDate吗?到期日期是从图书的借出日期派生的,所以我会尝试一种方法,比如book.isDue(today)
假设图书对象包含借出日期和到期日期作为属性。
对于这样的问题,如果您在设计对象之间的操作之前明确说明涉及哪些对象以及它们之间的关系是什么,将会有所帮助。