【问题标题】:How to check if date is at least previous day?如何检查日期是否至少是前一天?
【发布时间】:2021-05-17 16:02:39
【问题描述】:

大家好,在比较日期早于today

时,我想得到一个肯定的答案

为此,我使用带有此布尔值的Date 扩展

extension Date {   
    var isPreviousDate: Bool {
        return self.timeIntervalSinceNow.sign == .minus 
    }
}

这是我的问题..当我打印日期进行比较时,它告诉我今天的日期更早,我不明白为什么

由于我遇到问题,我尝试创建一个当前日期并将其与今天的日期进行比较,答案是今天的日期早于今天......这很奇怪,因为它不应该告诉我它更旧

这就是我创建date 进行比较的方式

    var calendar = Calendar(identifier: Calendar.current.identifier)
    calendar.timeZone = NSTimeZone(name: "UTC")! as TimeZone

    guard let selectedDate = calendar.date(from: DateComponents(year: Date().currentYear, month: Date().currentMonth, day: Date().currentDate)) else { return }

    print("isPrevious Date :",selectedDate.isPreviousDate)

    print(selectedDate)

我做错了吗?

这是我打印创建日期以进行比较时在控制台中读取的内容

isPrevious Date: true
2021-02-11 00:00:00 +0000

【问题讨论】:

  • 目前尚不清楚您要实现的目标,因为您在谈论“今天”,但您的代码正在使用时间戳。那么这是像“比今天更早”这样的日期比较,还是像“现在之前/当前时间”这样的时间比较?
  • 不,正如我在问题中所说,我需要将特定日期与当前日期进行比较,并知道特定日期是否早于当前日期。

标签: ios swift date calendar timezone


【解决方案1】:

timeIntervalSinceNow 是一个精度非常高的FloatingPoint 值,表示自Date 以来经过的秒数。


要检查当前日期是否至少在前一天,您可以执行以下操作:

extension Date {
    var isAtLeastPreviousDay: Bool {
        return isPast && !isToday
    }

    private var isPast: Bool {
        return self < Date()
    }

    private var isToday: Bool {
        return Calendar.current.isDateInToday(self)
    }    
}

【讨论】:

  • 感谢您的建议.. 显然我可以通过这种方式设置布尔值来解决它self &lt; Date() &amp;&amp; !Calendar.current.isDateInToday(self)
  • @kAiN 您的问题是您的日历时区设置为 UTC
【解决方案2】:

问题在于您使用的是使用 UTC 时区的自定义日历。您应该将当前日历与当前时区一起使用。请注意,您可以使用 Calendar 方法 startOfDay 来获取特定日期的开始日期:

extension Date {
    var isPreviousDate: Bool {
        timeIntervalSinceNow.sign == .minus
    }
    var startOfDay: Date {
        Calendar.current.startOfDay(for: self)
    }
}

let now = Date()
let startOfDay = now.startOfDay
print("isPrevious Date:", startOfDay.isPreviousDate) // true

如果您想检查某个日期是否在昨天,您只需使用日历方法 isDateInYesterday:

extension Date {
    var isDateInYesterday: Bool {
        Calendar.current.isDateInYesterday(self)
    }
}

Date().isDateInYesterday                                 // false
Date(timeIntervalSinceNow: -3600*24).isDateInYesterday  // true

【讨论】:

  • 并非每一天都有 24 小时,因此硬编码值(例如 -3600*24)不会创建准确的日期表示。为避免不准确,应使用日历完成每个日期计算。提问者想知道上一个日期是否至少是昨天,而不仅仅是昨天。
  • 这很明显。这是一个测试。
  • 他的分机很好。同一天的某个日期可能已经过去了
  • 是的,这一切我都知道。只是那个提问者想知道日期是否是&lt;= yesterday 而不仅仅是== yesterday
猜你喜欢
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
相关资源
最近更新 更多