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