Я хотел бы проверить, является ли NSDate раньше (в прошлом), сравнивая его с текущей датой. Как мне это сделать?
Спасибо
Я хотел бы проверить, является ли NSDate раньше (в прошлом), сравнивая его с текущей датой. Как мне это сделать?
Спасибо
Я нахожу метод earlierDate
.
if date1.earlierDate(date2).isEqualToDate(date1) {
print("date1 is earlier than date2")
}
У вас также есть метод laterDate
.
Свифт 3 на Свифт 5:
if date1 < date2 {
print("date1 is earlier than date2")
}
Существует простой способ сделать это. (Swift 3 еще проще, проверьте в конце ответа)
Быстрый код:
if myDate.timeIntervalSinceNow.isSignMinus {
//myDate is earlier than Now (date and time)
} else {
//myDate is equal or after than Now (date and time)
}
Если вам нужна дата сравнения без времени ( "MM/dd/yyyy" ).
Быстрый код:
//Ref date
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy"
let someDate = dateFormatter.dateFromString("03/10/2015")
//Get calendar
let calendar = NSCalendar.currentCalendar()
//Get just MM/dd/yyyy from current date
let flags = NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitYear
let components = calendar.components(flags, fromDate: NSDate())
//Convert to NSDate
let today = calendar.dateFromComponents(components)
if someDate!.timeIntervalSinceDate(today!).isSignMinus {
//someDate is berofe than today
} else {
//someDate is equal or after than today
}
Apple docs ссылку здесь.
Изменить 1: Важно
От Swift 3 примечания по миграции:
Мигратор консервативен, но есть некоторые виды использования NSDate, которые имеют лучшие представления в Swift 3:
(x as NSDate).earlierDate(y)
можно изменить наx < y ? x : y
(x as NSDate).laterDate(y)
можно изменить наx < y ? y : x
Итак, в Swift 3 вы можете использовать операторы сравнения.
Если вам нужно сравнить одну дату с теперь без создания нового объекта Date, вы можете просто использовать это в Swift 3:
if (futureDate.timeIntervalSinceNow.sign == .plus) {
// date is in future
}
и
if (dateInPast.timeIntervalSinceNow.sign == .minus) {
// date is in past
}
Вам не нужно расширять NSDate здесь, просто используйте "сравнить", как показано в docs.
Например, в Swift:
if currentDate.compare(myDate) == NSComparisonResult.OrderedDescending {
println("myDate is earlier than currentDate")
}
Вы можете расширить NSDate
, чтобы соответствовать протоколам Equatable
и Comparable
. Это протоколы сравнения в Swift и позволяют знакомым операторам сравнения (==, <, > и т.д.) Работать с датами. Поместите следующее в файл с соответствующим именем, например. NSDate+Comparison.swift
в вашем проекте:
extension NSDate: Equatable {}
extension NSDate: Comparable {}
public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.timeIntervalSince1970 == rhs.timeIntervalSince1970
}
public func <(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.timeIntervalSince1970 < rhs.timeIntervalSince1970
}
Теперь вы можете проверить, есть ли одна дата перед другой со стандартными операторами сравнения.
let date1 = NSDate(timeIntervalSince1970: 30)
let date2 = NSDate()
if date1 < date2 {
print("ok")
}
Информацию о расширениях в Swift см. здесь . Информацию о равных и сравниваемых протоколах см. Здесь здесь и здесь.
Примечание. В этом случае мы не создаем настраиваемые операторы, просто расширяя существующий тип для поддержки существующих операторов.
В Swift 4 вы можете использовать этот код
if endDate.timeIntervalSince(startDate).sign == FloatingPointSign.minus {
// endDate is in past
}
В Swift5
let nextDay = Calendar.current.date(byAdding: .day, value: -1, to: Date())
let toDay = Date()
print(toDay)
print(nextDay!)
if nextDay! < toDay {
print("date1 is earlier than date2")
}
let nextDay = Calendar.current.date(byAdding: .month, value: 1, to: Date())
let toDay = Date()
print(toDay)
print(nextDay!)
if nextDay! >= toDay {
print("date2 is earlier than date1")
}
Вот расширение в Swift, чтобы проверить, является ли дата более поздней.
extension Date {
var isPastDate: Bool {
return self < Date()
}
}
Использование:
let someDate = Date().addingTimeInterval(1)
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
print(date.isPastDate)
}
Сделал быструю Swift 2.3 функцию из этого
// if you omit last parameter you comare with today
// use "11/20/2016" for 20 nov 2016
func dateIsBefore(customDate:String, referenceDate:String="today") -> Bool {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy"
let myDate = dateFormatter.dateFromString(customDate)
let refDate = referenceDate == "today"
? NSDate()
: dateFormatter.dateFromString(referenceDate)
if NSDate().compare(myDate!) == NSComparisonResult.OrderedDescending {
return false
} else {
return true
}
}
Используйте его так, чтобы увидеть, была ли ваша дата до сегодняшнего дня.
if dateIsBefore("12/25/2016") {
print("Not Yet Christmas 2016 :(")
} else {
print("Christmas Or Later!")
}
Или с пользовательской контрольной датой
if dateIsBefore("12/25/2016", referenceDate:"12/31/2016") {
print("Christmas comes before new years!")
} else {
print("Something is really wrong with the world...")
}