如何解决 swift 中的日历问题? (即使在 objective-c 也很高兴看到)
How to fix calendar issue in swift? (glad to see even in objective-c)
日历实例的几种方法我都用过。所以,isDateInToday()
和isDateInTomorrow()
是影响UI部分的主要方法。让我们今天使用 isDateInToday()
(我的本地时间是 2019 年 8 月 28 日 21:37:00 ),它显示如下:
00:00 - 4:59 (false
)。这里 isDateInTomorrow()
显示 true
5:00 - 23:59 (true
)
日历标识符是 公历
区域设置为 en_US
时区是 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
?
好吧,我还没有找到确切的解决方案。但我已经做到了。我为今天和明天创建了两个日期实例。
...
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)
}
尝试使用本地时区间隔创建日期:
let seconds: TimeInterval = TimeInterval(TimeZone.current.secondsFromGMT())
let date = Date(timeIntervalSinceNow: seconds)
日历实例的几种方法我都用过。所以,isDateInToday()
和isDateInTomorrow()
是影响UI部分的主要方法。让我们今天使用 isDateInToday()
(我的本地时间是 2019 年 8 月 28 日 21:37:00 ),它显示如下:
00:00 - 4:59 (false
)。这里 isDateInTomorrow()
显示 true
5:00 - 23:59 (true
)
日历标识符是 公历
区域设置为 en_US
时区是 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
?
好吧,我还没有找到确切的解决方案。但我已经做到了。我为今天和明天创建了两个日期实例。
...
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)
}
尝试使用本地时区间隔创建日期:
let seconds: TimeInterval = TimeInterval(TimeZone.current.secondsFromGMT())
let date = Date(timeIntervalSinceNow: seconds)