如何快速解决日历问题? (即使在目标-c中也很高兴看到)

时间:2019-08-28 16:50:53

标签: ios swift xcode date calendar

我正在使用几种日历实例方法。因此,isDateInToday()isDateInTomorrow()是影响UI部分的主要方法。今天使用isDateInToday()(我的当地时间是2019年8月28日21:37:00),它显示以下内容:

00:00-4:59(否)。这里isDateInTomorrow()显示为真

5:00-23:59(是)

日历标识符为公历

语言环境为 zh_CN

timeZone是 GMT(secondsFromGMT = 0)

这是日历实例:

private var _calendar: Calendar = {
        var cal = Calendar.current
        cal.locale = Locale.current
        cal.timeZone = TimeZone(secondsFromGMT: 0)!
        return cal
    }()

这就是我创建日期的方式:

public var today: Date? {
        let date = Date()

        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        formatter.locale = .current
        let dateString = formatter.string(from: date)

        let formatterOut = DateFormatter()
        formatterOut.dateFormat = "yyyy-MM-dd HH:mm:ss"
        formatterOut.locale = Locale(identifier: "ru")
        formatterOut.timeZone = TimeZone(secondsFromGMT: 0)

        return formatterOut.date(from: dateString)
}

我应该怎么做才能在今天00:00到23:59之间显示true

2 个答案:

答案 0 :(得分:1)

尝试使用本地时区间隔创建日期:

let seconds: TimeInterval = TimeInterval(TimeZone.current.secondsFromGMT())
let date = Date(timeIntervalSinceNow: seconds)

答案 1 :(得分:0)

好吧,我还没有找到确切的解决方案。但是我已经做到了。我为今天和明天创建了两个日期实例。

...
let today = Date()
...
let tomorrow = calendar.date(byAdding: .day, value: 1, to: today)

这就是我对isDateInToday()isDateInTomorrow()的解决方案。我忽略了时间。

func isDateInToday(_ date: Date) -> Bool {
    let year = calendar.compare(date, to: today, toGranularity: .year)
    let month = calendar.compare(date, to: today, toGranularity: .month)
    let day = calendar.compare(date, to: today, toGranularity: .day)
    return (year == .orderedSame && month == .orderedSame && day == .orderedSame)
}

func isDateInTomorrow(_ date: Date) -> Bool {
    let year = calendar.compare(date, to: tomorrow, toGranularity: .year)
    let month = calendar.compare(date, to: tomorrow, toGranularity: .month)
    let day = calendar.compare(date, to: tomorrow, toGranularity: .day)
    return (year == .orderedSame && month == .orderedSame && day == .orderedSame)
}