How can I tell if DateTime.Now() is on a day AFTER a different DateTime

后端 未结 5 1494
庸人自扰
庸人自扰 2021-01-23 17:43

I\'m running this on flutter, but I guess this could be a more general issue.

I am saving a DateTime in the preferences. I want to be able to then tell if DateTime

相关标签:
5条回答
  • 2021-01-23 17:54

    I don't know flutter, but my approach would be to not store the last check, but store the date at which the next check should occur. So when you perform a check you calculate the next midnight and store that. Now you can use isAfter.

    In javascript this would look something like this:

    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
    }
    

    of course you could also calculate nextCheck every time you want to compare it, but I dislike performing the same calculation over and over if I can avoid it.

    A thing to mention here is timezones, depending on your date library and if your system and user timezones align, you may need to shift the date.

    0 讨论(0)
  • I cannot write a complete code for now but this is what it would look like:

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

    You give an expiration date and compare the DateTime to that. You have to use isAfter for reliability, instead of .day check.

    0 讨论(0)
  • 2021-01-23 18:04

    You can use the difference method to get the difference between 2 dates and check whether those differs in hours with at-least 24 hours. So your if condition becomes:

    if (now.isAfter(lastDailyCheck) &&
        (lastDailyCheck.day != now.day ||
        now.difference(lastDailyCheck).inHours > 24)) {
        print('After');
    }
    
    0 讨论(0)
  • 2021-01-23 18:17

    I would compute the difference between midnight of the day of the last timestamp and midnight of the current timestamp. That is, consider only the date portion of a DateTime and ignore the time.

    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.
    }
    

    If you're using UTC timestamps and don't care about when midnight is in whatever the local time is, the comparison could more intuitively use .inDays >= 1.

    0 讨论(0)
  • 2021-01-23 18:17

    Figured out another potential solution!

    In addition to checking if the day is different (which by itself won't work) you can also check the month and year. Only 1 of those needs to differ for it be true :)

    if (now.isAfter(lastDailyCheck)) {
      if (now.day != lastDailyCheck.day ||
          now.month != lastDailyCheck.month ||
          now.year != lastDailyCheck.year) {
        return true;
      }
    }
    
    0 讨论(0)
提交回复
热议问题