Swift를 사용한NSDate 비교
나는 숙제 마감일을 확인해야 하는 앱을 만들고 있다.납기일이 다음 주 이내인지 알고 싶습니다만, 납기일이 다음 주 이내라면 조치를 취하십시오.
제가 찾을 수 있는 대부분의 문서는 Objective-C에 있는데 Swift에서 어떻게 해야 하는지 모르겠습니다.도와주셔서 감사합니다!!
서포트하고 싶은 경우==
,<
,>
,<=
, 또는>=
위해서NSDate
s, 이것을 어딘가에 선언할 필요가 있습니다.
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 { }
코드를 읽기 쉽게 하기 위해 확장자를 사용하는 것이 좋습니다.다음은 코드를 정리하고 이해하기 쉽게 하는 데 도움이 되는 몇 가지 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...
}
이것이 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
이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
}
}
swift 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를 로 변경해 주세요.
. year . month . day . hour . minute . second .
Swift는 이미 날짜 비교를 구현했습니다.date1 > date2 등을 사용합니다.
/// 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
/// Add a `TimeInterval` to a `Date`.
///
/// - warning: This only adjusts an absolute value. If you wish to add calendrical concepts like hours, days, months then you must use a `Calendar`. That will take into account complexities like daylight saving time, months with different numbers of days, and more.
public static func +=(lhs: inout Date, rhs: TimeInterval)
/// Subtract a `TimeInterval` from a `Date`.
///
/// - warning: This only adjusts an absolute value. If you wish to add calendrical concepts like hours, days, months then you must use a `Calendar`. That will take into account complexities like daylight saving time, months with different numbers of days, and more.
public static func -=(lhs: inout Date, rhs: TimeInterval)
Swift 3에서 Date는 Comparible이므로 다음과 같은 날짜를 직접 비교할 수 있습니다.
let date1 = Date()
let date2 = Date()
let isGreater = date1 > date2
print(isGreater)
let isEqual = date1 == date2
print(isEqual)
또는 다른 방법으로
let result = date1.compare(date2)
switch result {
case .OrderedAscending : print("date 1 is earlier than date 2")
case .OrderedDescending : print("date 1 is later than date 2")
case .OrderedSame : print("two dates are the same")
}
보다 좋은 방법extension
날짜에
extension Date {
fun isGreater(than date: Date) -> Bool {
return self > date
}
func isSmaller(than date: Date) -> Bool {
return self < date
}
func isEqual(to date: Date) -> Bool {
return self == date
}
}
사용.let isGreater = date1.isGreater(than: date2)
이 함수는 하나의 날짜(startDate)가 endDate 이후인지 비교하는데 도움이 되었습니다.여기서 두 날짜 모두 NSDate 변수로 정의되었습니다.
if startDate.compare(endDate as Date) == ComparisonResult.orderedDescending
에서의 실장Swift
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
let files = NSFileManager.defaultManager().contentsOfDirectoryAtPath(documentsPath, error: nil)
let filesAndProperties = NSMutableArray()
for file in files! {
let filePath = documentsPath.stringByAppendingString(file as NSString)
let properties = NSFileManager.defaultManager().attributesOfItemAtPath(filePath, error: nil)
let modDate = properties![NSFileModificationDate] as NSDate
filesAndProperties.addObject(NSDictionary(objectsAndKeys: file, "path", modDate, "lastModDate"))
}
let sortedFiles = filesAndProperties.sortedArrayUsingComparator({
(path1, path2) -> NSComparisonResult in
var comp = (path1.objectForKey("lastModDate") as NSDate).compare(path2.objectForKey("lastModDate") as NSDate)
if comp == .OrderedDescending {
comp = .OrderedAscending
} else if comp == .OrderedAscending {
comp = .OrderedDescending
}
return comp
})
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateData: String = dateFormatter.stringFromDate(date1)
let testDate: String = dateFormatter.stringFromDate(date2)
print(dateData == testDate)
someArray.sort({($0.dateAdded?.timeIntervalSinceReferenceDate)! < ($1.dateAdded?.timeIntervalSinceReferenceDate)!})
dateAdded는 객체의 NSDate 변수입니다.
class MyClass {
let dateAdded: NSDate?
}
현재 시각을 2회(2일) 체크하는 시나리오가 있습니다.예를 들어, 진료소(병원)의 개점 시간과 폐점 시간 사이의 현재 위치를 확인하고 싶습니다.
심플 코드를 사용합니다.
NSDate * now = [NSDate date];
NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
[outputFormatter setDateFormat:@"HH:mm:ss"];
//current time
NSString *currentTimeString = [outputFormatter stringFromDate:now];
NSDate *dateCurrent = [outputFormatter dateFromString:currentTimeString];
NSString *timeStart = @"09:00:00";
NSString *timeEnd = @"22:00:00";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm:ss"];
NSDate *dateStart= [formatter timeStart];
NSDate *dateEnd = [formatter timeEnd];
NSComparisonResult result = [dateCurrent compare:dateStart];
NSComparisonResult resultSecond = [date2 compare:dateEnd];
if(result == NSOrderedDescending && resultSecond == NSOrderedDescending)
{
NSLog(@"current time lies in starting and end time");
}else {
NSLog(@"current time doesn't lie in starting and end time");
}
swift 3의 경우 아래 함수를 사용하여 두 날짜를 비교할 수 있습니다.
func compareDate(dateInitial:Date, dateFinal:Date) -> Bool {
let order = Calendar.current.compare(dateInitial, to: dateFinal, toGranularity: .day)
switch order {
case .orderedSame:
return true
default:
return false
}
}
비교 적용 대상 제약 조건에 따라 세분성을 변경할 수 있습니다.
SashaZ에서 연장하려면 - Swift iOS 8 이상
- 이 날짜들은 같은 날짜인가요?
- 이 날짜들은 같은 달인가요?
- 이 날짜는 다른 달보다 전월 날짜입니까?
단순히 더 크거나 더 작은 날짜의 비교가 필요한 경우.예를 들어 같은 날인지 전날인지...
주의: 시간대를 잊지 마십시오.캘린더의 타임존에는 디폴트가 설정되어 있습니다만, 디폴트가 마음에 들지 않는 경우는, 직접 타임존을 설정할 필요가 있습니다.요일을 알기 위해서는 어느 시간대를 묻고 있는지 알아야 합니다.
extension Date {
func compareTo(date: Date, toGranularity: Calendar.Component ) -> ComparisonResult {
var cal = Calendar.current
cal.timeZone = TimeZone(identifier: "Europe/Paris")!
return cal.compare(self, to: date, toGranularity: toGranularity)
}
}
다음과 같이 사용합니다.
if thisDate.compareTo(date: Date(), toGranularity: .day) == .orderedDescending {
// thisDate is a previous day
}
좀 더 복잡한 예시로요.어레이 내의 모든 날짜를 검색하여 필터링합니다.이 날짜는 "find"와 같은 날짜입니다.오늘" :
let formatter = DateFormatter()
formatter.timeZone = TimeZone(identifier: "Europe/Paris")
formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
let findThisDay = formatter.date(from: "2018/11/05 08:11:08")!
_ = [
formatter.date(from: "2018/12/05 08:08:08")!,
formatter.date(from: "2018/11/05 08:11:08")!,
formatter.date(from: "2018/11/05 11:08:22")!,
formatter.date(from: "2018/11/05 22:08:22")!,
formatter.date(from: "2018/11/05 08:08:22")!,
formatter.date(from: "2018/11/07 08:08:22")!,
]
.filter{ findThisDay.compareTo(date: $0 , toGranularity: .day) == .orderedSame }
.map { print(formatter.string(from: $0)) }
언급URL : https://stackoverflow.com/questions/26198526/nsdate-comparison-using-swift
'source' 카테고리의 다른 글
WPF-MVVM: ViewModel에서 UI 제어 포커스 설정 (0) | 2023.04.12 |
---|---|
Mac과 Windows 모두에서 Excel로 CSV 파일을 올바르게 여는 인코딩은 무엇입니까? (0) | 2023.04.12 |
HTML 양식의 작업 속성에 빈 URL을 사용하는 것이 좋은 방법입니까?(action=")" (0) | 2023.04.12 |
EMDERVAL을 사용하여 닫힌 Excel 워크북의 값을 참조하시겠습니까? (0) | 2023.04.12 |
SQL Server 2008 열 이름 변경 (0) | 2023.04.07 |