숙제 마감일을 확인해야하는 앱을 개발 중입니다. 기한이 다음 주 이내인지 알고 싶습니다. 그런 다음 조치를 취합니다.
내가 찾을 수있는 대부분의 문서는 Objective-C에 있으며 Swift에서 수행하는 방법을 알 수 없습니다. 도와 주셔서 감사합니다!!
답변
나는 코드를 더 읽기 쉽게하기 위해 확장을 사용하는 것을 좋아합니다. 다음은 코드를 정리하고 이해하기 쉽게 만드는 몇 가지 NSDate 확장입니다. 나는 이것을 sharedCode.swift 파일에 넣었습니다.
extension NSDate {
func isGreaterThanDate(dateToCompare: NSDate) -> Bool {
//Declare Variables
var isGreater = false
//Compare Values
if self.compare(dateToCompare as Date) == ComparisonResult.orderedDescending {
isGreater = true
}
//Return Result
return isGreater
}
func isLessThanDate(dateToCompare: NSDate) -> Bool {
//Declare Variables
var isLess = false
//Compare Values
if self.compare(dateToCompare as Date) == ComparisonResult.orderedAscending {
isLess = true
}
//Return Result
return isLess
}
func equalToDate(dateToCompare: NSDate) -> Bool {
//Declare Variables
var isEqualTo = false
//Compare Values
if self.compare(dateToCompare as Date) == ComparisonResult.orderedSame {
isEqualTo = true
}
//Return Result
return isEqualTo
}
func addDays(daysToAdd: Int) -> NSDate {
let secondsInDays: TimeInterval = Double(daysToAdd) * 60 * 60 * 24
let dateWithDaysAdded: NSDate = self.addingTimeInterval(secondsInDays)
//Return Result
return dateWithDaysAdded
}
func addHours(hoursToAdd: Int) -> NSDate {
let secondsInHours: TimeInterval = Double(hoursToAdd) * 60 * 60
let dateWithHoursAdded: NSDate = self.addingTimeInterval(secondsInHours)
//Return Result
return dateWithHoursAdded
}
}
이제 다음과 같이 할 수 있다면 :
//Get Current Date/Time
var currentDateTime = NSDate()
//Get Reminder Date (which is Due date minus 7 days lets say)
var reminderDate = dueDate.addDays(-7)
//Check if reminderDate is Greater than Right now
if(reminderDate.isGreaterThanDate(currentDateTime)) {
//Do Something...
}
답변
지원하려는 경우 ==
, <
, >
, <=
, 또는 >=
위해 NSDate
의, 당신은이 곳을 선언해야합니다 :
public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs === rhs || lhs.compare(rhs) == .OrderedSame
}
public func <(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.compare(rhs) == .OrderedAscending
}
extension NSDate: Comparable { }
답변
이것이 Swift에서 두 개의 NSDates를 비교하는 방법입니다. 방금 Xcode의 플레이 그라운드에서 테스트했습니다.
if date1.compare(date2) == NSComparisonResult.OrderedDescending
{
NSLog("date1 after date2");
} else if date1.compare(date2) == NSComparisonResult.OrderedAscending
{
NSLog("date1 before date2");
} else
{
NSLog("dates are equal");
}
따라서 날짜 dueDate
가 지금부터 일주일 이내 인지 확인하려면 다음을 수행하십시오 .
let dueDate=...
let calendar = NSCalendar.currentCalendar()
let comps = NSDateComponents()
comps.day = 7
let date2 = calendar.dateByAddingComponents(comps, toDate: NSDate(), options: NSCalendarOptions.allZeros)
if dueDate.compare(date2!) == NSComparisonResult.OrderedDescending
{
NSLog("not due within a week");
} else if dueDate.compare(date2!) == NSComparisonResult.OrderedAscending
{
NSLog("due within a week");
} else
{
NSLog("due in exactly a week (to the second, this will rarely happen in practice)");
}
답변
나는 항상 한 줄로했다.
let greater = date1.timeIntervalSince1970 < date2.timeIntervalSince1970
if
블록 에서 여전히 읽을 수 있음
답변
Swift3에서의 Date
구조체는 Foundation
이제 Comparable
프로토콜을 구현합니다 . 따라서 이전 Swift2 NSDate
접근 방식은 Swift3 로 대체됩니다 Date
.
/**
`Date` represents a single point in time.
A `Date` is independent of a particular calendar or time zone. To represent a `Date` to a user, you must interpret it in the context of a `Calendar`.
*/
public struct Date : ReferenceConvertible, Comparable, Equatable {
// .... more
/**
Returns the interval between the receiver and another given date.
- Parameter another: The date with which to compare the receiver.
- Returns: The interval between the receiver and the `another` parameter. If the receiver is earlier than `anotherDate`, the return value is negative. If `anotherDate` is `nil`, the results are undefined.
- SeeAlso: `timeIntervalSince1970`
- SeeAlso: `timeIntervalSinceNow`
- SeeAlso: `timeIntervalSinceReferenceDate`
*/
public func timeIntervalSince(_ date: Date) -> TimeInterval
// .... more
/// Returns true if the two `Date` values represent the same point in time.
public static func ==(lhs: Date, rhs: Date) -> Bool
/// Returns true if the left hand `Date` is earlier in time than the right hand `Date`.
public static func <(lhs: Date, rhs: Date) -> Bool
/// Returns true if the left hand `Date` is later in time than the right hand `Date`.
public static func >(lhs: Date, rhs: Date) -> Bool
/// Returns a `Date` with a specified amount of time added to it.
public static func +(lhs: Date, rhs: TimeInterval) -> Date
/// Returns a `Date` with a specified amount of time subtracted from it.
public static func -(lhs: Date, rhs: TimeInterval) -> Date
// .... more
}
노트 …
Swift3에서 Date
is struct
는 value type
. NSDate
이다 class
, 그것은이다 reference type
.
// Swift3
let a = Date()
let b = a //< `b` will copy `a`.
// So, the addresses between `a` and `b` are different.
// `Date` is some kind different with `NSDate`.
답변
extension NSDate {
// MARK: - Dates comparison
func isGreaterThanDate(dateToCompare: NSDate) -> Bool {
return self.compare(dateToCompare) == NSComparisonResult.OrderedDescending
}
func isLessThanDate(dateToCompare: NSDate) -> Bool {
return self.compare(dateToCompare) == NSComparisonResult.OrderedAscending
}
func equalToDate(dateToCompare: NSDate) -> Bool {
return self.compare(dateToCompare) == NSComparisonResult.OrderedSame
}
}
답변
신속한 3에서 날짜를 세분화하여 (같은 날 또는 연도 등) 비교하려는 경우.
func compareDate(date1:NSDate, date2:NSDate, toUnitGranularity: NSCalendar.Unit) -> Bool {
let order = NSCalendar.current.compare(date1 as Date, to: date2 as Date, toGranularity: .day)
switch order {
case .orderedSame:
return true
default:
return false
}
}
다른 달력 비교의 경우 .day를 다음으로 변경하십시오.
. 년. 월. 일. 시간. 분. 초