Как я могу сказать, что DateTime.Now () в день ПОСЛЕ другого DateTime - PullRequest
1 голос
/ 17 апреля 2020

Я запускаю это на флаттере, но я думаю, что это может быть более общей проблемой.

Я сохраняю DateTime в настройках. Затем я хочу узнать, находится ли DateTime.now() на хотя бы через день после последнего сохраненного DateTime, т. Е.

(pseudocode)
lastDailyCheck = 2020.04.10
now = 2020.04.11

=> сейчас на следующий день после lastDailyCheck.

Это уже должно работать, если в новый день 00:01, даже если lastDailyCheck был в 23:58 накануне, то есть разница может составлять всего лишь минуты между двумя датами DateTimes.

Оказывается, это действительно сложно!

Вот что не работает:

DateTime.Now().isAfter(lastDailyCheck)

Это только проверяет, если сейчас после последний, он также возвращает true через секунду и в тот же день.

DateTime.Now().isAfter(lastDailyCheck) && lastDailyCheck.day != DateTime.Now().day

Я думал, что это было умно. Если день другой и он равен после последнего, то он распознает день позже, но потом я понял, что он выйдет из строя, когда оба дня скажутся 15-го числа месяца - тогда lastDailyCheck.day будет равно DateTime.Now().day.

Как вы думаете, что было бы возможно здесь?

Ответы [ 5 ]

2 голосов
/ 18 апреля 2020

Я не знаю, трепетание, но мой подход заключается в том, чтобы не хранить последнюю проверку, а сохранить дату, когда должна произойти следующая проверка. Поэтому, когда вы выполняете проверку, вы рассчитываете следующую полночь и сохраняете ее. Теперь вы можете использовать isAfter.

В javascript это будет выглядеть примерно так:

const now = new Date();

//this also handles overflow into the next month
const nextCheck = new Date(now.getYear(), now.getMonth(), now.getDate() + 1)

//store nextCheck somewhere

//in js there is no isAfter, you just use >
if(new Date() > nextCheck) {
   //do the thing
}

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

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

1 голос
/ 17 апреля 2020

Вы можете использовать метод разница , чтобы получить разницу между двумя датами и проверить, отличаются ли они часами, по крайней мере, с 24 часами. Таким образом, ваше условие if становится:

if (now.isAfter(lastDailyCheck) &&
    (lastDailyCheck.day != now.day ||
    now.difference(lastDailyCheck).inHours > 24)) {
    print('After');
}
1 голос
/ 17 апреля 2020

Я бы вычислил разницу между полуночью дня последней отметки времени и полуночью текущей отметки времени. То есть, учитывайте только часть даты в DateTime и игнорируйте время.

DateTime date(DateTime dateTime) =>
    DateTime(dateTime.year, dateTime.month, dateTime.day);

// Intentionally check for a positive difference in hours instead of days
// so we don't need to worry about 23-hour days from DST.  Any non-zero
// number of hours here means a difference of at least a "day".
if (date(DateTime.now()).difference(date(lastDailyCheck)).inHours > 0) {
  // "One day" after.
}

Если вы используете временные метки UT C и не заботитесь о том, когда полночь находится в любом местном время, сравнение может более интуитивно использовать .inDays >= 1.

1 голос
/ 17 апреля 2020

Пока я не могу написать полный код, но он выглядит так:

(pseudocode)

expirationDay = lastDailyCheck.add(oneDayDuration);
isOneDayAfter = DateTime.now().isAfter(expirationDay);

Вы указываете дату окончания срока действия и сравниваете DateTime с этим. Вы должны использовать isAfter для надежности вместо .day проверки.

0 голосов
/ 21 апреля 2020

Обдумал другое потенциальное решение!

В дополнение к проверке, отличается ли день (что само по себе не будет работать), вы также можете проверить месяц и год. Только 1 из них должен отличаться, чтобы быть правдой:)

if (now.isAfter(lastDailyCheck)) {
  if (now.day != lastDailyCheck.day ||
      now.month != lastDailyCheck.month ||
      now.year != lastDailyCheck.year) {
    return true;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...