Какой метод я должен использовать? - PullRequest
0 голосов
/ 25 октября 2009

Я - средний Java-кодер, пишу библиотечное Java-приложение, и по какой-то причине я просто не могу понять, должен ли я использовать метод dueDate.after(today) ИЛИ dueDate.before(today), чтобы решить, просрочена ли книга. Я получил довольно противоречивые значения, набрав оба метода. Следовательно, я также предполагаю, что в моем коде также есть какая-то другая ошибка, поэтому было бы неплохо, если бы вы могли подтвердить, что это правильный метод, чтобы я мог приступить к исправлению другой ошибки.

Ответы [ 5 ]

6 голосов
/ 25 октября 2009

Вам нужно dueDate.before(today): срок оплаты до сегодняшнего дня; срок исполнения истек, поэтому книга просрочена.

Может быть, проще, если вы меняете объекты вокруг? Вы получите today.after(dueDate), и если вы прочитаете это вслух, внезапно станет совершенно ясно: «если сегодня более поздний срок, то ...»

1 голос
/ 25 октября 2009

Помните, что методы before и after выполняют сравнение < (или >), а не <= (или >= сравнение). Это то, что подразумевается под словом «строго» в документации API.

Кроме того, объекты Java Date действительно являются моментом времени, а не тем, что люди обычно считают «датой». То есть сравнивается не только день, но и время суток.

Если вы хотите сравнить только день, не проверяя время в течение этого дня, создайте все свои даты исполнения в определенное время, например, в полночь. Например, предположим, что книга должна быть выпущена 26 октября. Срок оплаты может быть полночь, 27 октября.

boolean overdue = !now.before(dueDate);

Несколько неловкое отрицание объясняет случай, когда сейчас ровно 12:00 27 октября.

0 голосов
/ 25 октября 2009

Это зависит от того, чего вы хотите достичь. Является ли dueDate дата, которую вы хотите установить при предоставлении книги? Срок оплаты определяется по дате выдачи книги, поэтому я бы попробовал такой подход, как book.isDue(today), предполагая, что объект книги содержит даты выдачи и погашения в качестве атрибутов.

С такими вопросами полезно, если вы сами четко дадите понять, какие объекты задействованы и каковы их отношения, прежде чем разрабатывать действия между объектами.

0 голосов
/ 25 октября 2009

Единственная разница между !dueDate.after(today) и dueDate.before(today) - это результат, когда обе даты абсолютно одинаковы - предположительно, книга не просрочена, когда возвращается в срок, поэтому dueDate.before(today) должно быть правильным.

Что касается ваших неуточненных других проблем: знаете ли вы, что java.util.Date представляет собой момент времени с точностью до миллисекунды, а не календарную дату? Это означает, что для того, чтобы использовать его методы сравнения для календарных дат, вы должны быть очень уверены, что вы устанавливаете компоненты времени на ноль при создании ваших экземпляров Date. Другой причиной проблем могут быть различия часовых поясов.

0 голосов
/ 25 октября 2009

dueDate.before(today) будет переводиться в фактическую дату выпуска книги, существовавшую до сегодняшнего дня, что означает, что она действительно просрочена. Это, вероятно, то, что вы хотите (при условии, что вы проверяете на истинность)

другая сторона вещей

dueDate.after(today) будет переводиться в фактическую дату издания книги, появившейся после сегодняшнего дня, что означает, что она еще не истекла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...