【问题标题】:How can I tell if DateTime.Now() is on a day AFTER a different DateTime如何判断 DateTime.Now() 是否在不同 DateTime 之后的一天
【发布时间】:2020-04-17 08:11:11
【问题描述】:

我在颤振上运行它,但我想这可能是一个更普遍的问题。

我在首选项中保存了一个日期时间。然后我希望能够判断DateTime.now() 是否在至少在最后一次保存的 DateTime 之后的一天,即

(pseudocode)
lastDailyCheck = 2020.04.10
now = 2020.04.11

=> 现在是 lastDailyCheck 的第二天。

如果它是新一天的 00:01,这应该已经有效,即使 lastDailyCheck 是前一天的 23:58,这意味着 2 个 DateTimes 之间的差异可以低至几分钟。

原来这真的很复杂!

以下是不起作用的:

DateTime.Now().isAfter(lastDailyCheck)

这仅检查 now 是否在 最后一个之后,它也在一秒钟后返回 true,并且在同一天。

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

我认为这很聪明。如果这一天不同并且它是最后一天之后,那么它确实可以识别它是一天之后 - 但后来我意识到当这两天都在一个月的 15 号时它会出错 -那么lastDailyCheck.day 将等于DateTime.Now().day

你认为这里有什么可能?

【问题讨论】:

    标签: date datetime flutter dart


    【解决方案1】:

    这是我更喜欢根据两个不同时间之间的比较来做一些逻辑的方式:

    var now = DateTime.now();
    var myDate = new DateTime.utc(2022, 1, 1);
    if(myDate.compareTo(now)>0) //positive value means myDate is greater than DateTime.now()
    {
      // here is your logic based on the comparison between two times
    } else {
     //your logic if DateTime.now() pass myDate
    }
    

    【讨论】:

      【解决方案2】:

      想出了另一个可能的解决方案!

      除了检查日期是否不同(这本身不起作用)之外,您还可以检查月份和年份。其中只有 1 个需要不同,因为它是真的:)

      if (now.isAfter(lastDailyCheck)) {
        if (now.day != lastDailyCheck.day ||
            now.month != lastDailyCheck.month ||
            now.year != lastDailyCheck.year) {
          return true;
        }
      }
      

      【讨论】:

        【解决方案3】:

        这是一个简洁答案的尝试。只需导出此扩展并使用它。有了它,您可以判断日期是否至少比当天晚一天。

        extension DateExt on DateTime {
          bool isAtLeastOneDayAfterToday() {
            final now = DateTime.now();
        
            return (isAfter(now) &&
                (day != now.day || month != now.month || year != now.year));
          }
        }
        

        像这样使用它:

        final isAfter = myDay.isAtLeastOneDayAfterToday(); //will be true or false
        

        【讨论】:

          【解决方案4】:

          我现在无法编写完整的代码,但这就是它的样子:

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

          您给出一个到期日期并将DateTime 与该日期进行比较。为了可靠性,您必须使用isAfter,而不是.day 检查。

          【讨论】:

          • 很酷的方法! :) 不确定当 2 天之间的实际差异小于 24 小时时它会完全起作用,例如lastDailyCheck 23:00,当天12:00
          【解决方案5】:

          我不知道颤振,但我的方法是不存储最后一次检查,而是存储下一次检查应该发生的日期。因此,当您执行检查时,您会计算下一个午夜并存储它。现在您可以使用 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,但如果可以避免的话,我不喜欢一遍又一遍地执行相同的计算。

          这里要提到的是时区,具体取决于您的日期库,如果您的系统和用户时区一致,您可能需要更改日期。

          【讨论】:

          • 这听起来像是一个更聪明的方法,我会试试的! :D
          • 我知道这与原始问题无关,但这个答案实际上保存了我的代码,因为我试图在我的计算中添加固定的天数并且我遇到了 DST 问题!使用像DateTime(2021, 11, 01-7) 这样的东西实际上包括我们的夏令时计算。哇!谢谢!
          【解决方案6】:

          我会计算上一个时间戳当天的午夜与当前时间戳的午夜之间的差异。也就是说,只考虑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.
          }
          

          如果您使用 UTC 时间戳并且不关心午夜是什么时候,无论当地时间是什么,比较可以更直观地使用 .inDays >= 1

          【讨论】:

            【解决方案7】:

            您可以使用difference 方法获取 2 个日期之间的差异,并检查这些日期是否在至少 24 小时内不同。所以你的 if 条件变成:

            if (now.isAfter(lastDailyCheck) &&
                (lastDailyCheck.day != now.day ||
                now.difference(lastDailyCheck).inHours > 24)) {
                print('After');
            }
            

            【讨论】:

            • 很好,这应该绕过潜在的lastDailyCheck.day != now.day 问题! :D
            猜你喜欢
            • 2013-07-29
            • 2015-11-15
            • 2012-11-09
            • 2017-08-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-06
            • 1970-01-01
            相关资源
            最近更新 更多