Странное поведение при использовании между? метод для дат - PullRequest
3 голосов
/ 10 января 2009

Откройте консоль Rails и введите это:

2.weeks.ago.between? 2.weeks.ago, 1.week.ago

Это дало вам истину или ложь? Нет, на самом деле, попробуйте еще несколько раз, и он даст вам разные ответы.

Теперь я думаю, что из-за того, что мы сравниваем 2.weeks.ago с 2.weeks.ago, время между оценкой двух операторов вызывает такое поведение.

Не могу точно сказать, но я предполагаю, что между? Метод не является включающим, и поэтому, если между двумя операторами прошло несколько миллисекунд, приведенный выше код будет иметь значение true, поскольку он будет находиться между двумя сравниваемыми датами.

Однако, если ЦПУ удается обработать это достаточно быстро, чтобы истекшее время игнорировалось, тогда оно оценивается как ложное.

Может кто-нибудь пролить свет на это? Это, в лучшем случае, крайний случай в системе, где это может быть критически важно, но это доставляло мне головную боль, когда мои тесты проходили и, по-видимому, не сработали.

Как ни странно, этого не происходит:

 Date.yesterday.between? Date.yesterday, Date.tomorrow

Ответы [ 5 ]

5 голосов
/ 10 января 2009

Причина, несомненно, связана с разрешением функции времени. Иногда два экземпляра 2.weeks.ago разрешаются одновременно, а иногда нет. Когда вы используете вчера, вы не видите проблему, потому что она всегда разрешается до нуля, а не относительно текущего времени.

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

1 голос
/ 10 января 2009

Я просто попробовал это и каждый раз получал ложь. Какова цель этого вопроса? Я спрашиваю, потому что я делаю сравнение дат на уровне БД.

1 голос
/ 10 января 2009

tvanfosson, ударь его по голове.

2.weeks.ago дает вам ровно две недели от исполнения до миллисекунды. Таким образом, оценка его дважды может дать два разных времени.

Выполнение чего-либо подобного приведёт к последовательным результатам:

two_weeks_ago = 2.weeks.ago
two_weeks_ago.between? two_weeks_ago, 1.week.ago
0 голосов
/ 12 января 2009

Попробуйте сделать:

two_weeks_ago = 2.weeks.ago.to_date
two_weeks_ago.between? two_weeks_ago, 1.week.ago
0 голосов
/ 10 января 2009

Определенно из-за того, что thwt 2.weeks.ago вызывается дважды, каждый раз возвращая другой ответ, из-за времени обработки Но имеет ли это значение. Функция между работает точно так, как задумано. Поведение не странное, потому что если вы войдете в код с помощью отладчика, вы увидите, что он работает точно так же, как и должен.

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