Swift 3를 사용하면 필요에 따라 다음 두 가지 방법 중 하나를 선택하여 문제를 해결할 수 있습니다.
1. 두 날짜의 차이를 사용자에게 표시
a DateComponentsFormatter
를 사용하여 앱 인터페이스에 대한 문자열을 만들 수 있습니다 . DateComponentsFormatter
가 maximumUnitCount
다음과 같은 선언 속성을 :
var maximumUnitCount: Int { get set }
결과 문자열에 표시되는 단위 수를 제한하려면이 특성을 사용하십시오. 예를 들어이 속성을 "1h 10m, 30s"대신 2로 설정하면 결과 문자열은 "1h 10m"이됩니다. 공간이 제한되거나 값을 가장 가까운 큰 단위로 반올림하려는 경우이 특성을 사용하십시오.
maximumUnitCount
의 값을 로 설정 1
하면 단 하나 DateComponentsFormatter
의 단위 (년, 월, 일, 시간 또는 분) 만 차이를 표시 할 수 있습니다 .
아래의 운동장 코드는 두 날짜의 차이를 표시하는 방법을 보여줍니다.
import Foundation
let oldDate = Date(timeIntervalSinceReferenceDate: -16200)
let newDate = Date(timeIntervalSinceReferenceDate: 0)
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [NSCalendar.Unit.year, .month, .day, .hour, .minute]
dateComponentsFormatter.maximumUnitCount = 1
dateComponentsFormatter.unitsStyle = DateComponentsFormatter.UnitsStyle.full
let timeDifference = dateComponentsFormatter.string(from: oldDate, to: newDate)
print(String(reflecting: timeDifference)) // prints Optional("5 hours")
DateComponentsFormatter
결과 를 반올림합니다. 따라서 4 시간 30 분 의 차이는 5 시간 으로 표시됩니다 .
이 작업을 반복해야하는 경우 코드를 리팩터링 할 수 있습니다.
import Foundation
struct Formatters {
static let dateComponentsFormatter: DateComponentsFormatter = {
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [NSCalendar.Unit.year, .month, .day, .hour, .minute]
dateComponentsFormatter.maximumUnitCount = 1
dateComponentsFormatter.unitsStyle = DateComponentsFormatter.UnitsStyle.full
return dateComponentsFormatter
}()
}
extension Date {
func offset(from: Date) -> String? {
return Formatters.dateComponentsFormatter.string(from: oldDate, to: self)
}
}
let oldDate = Date(timeIntervalSinceReferenceDate: -16200)
let newDate = Date(timeIntervalSinceReferenceDate: 0)
let timeDifference = newDate.offset(from: oldDate)
print(String(reflecting: timeDifference)) // prints Optional("5 hours")
2. 서식을 지정하지 않고 두 날짜의 차이를 얻습니다.
사용자와 두 날짜의 차이를 형식화하여 표시 할 필요가없는 경우을 사용할 수 있습니다 Calendar
. 다음 선언 Calendar
이있는 메소드 dateComponents(_:from:to:)
가 있습니다.
func dateComponents(_ components: Set<Calendar.Component>, from start: Date, to end: Date) -> DateComponents
두 날짜의 차이를 반환합니다.
아래의 놀이터 코드는 dateComponents(_:from:to:)
한 가지 유형 Calendar.Component
(년, 월, 일, 시간 또는 분)으로 차이를 반환하여 두 날짜 간의 차이를 검색하는 방법을 보여줍니다 .
import Foundation
let oldDate = Date(timeIntervalSinceReferenceDate: -16200)
let newDate = Date(timeIntervalSinceReferenceDate: 0)
let descendingOrderedComponents = [Calendar.Component.year, .month, .day, .hour, .minute]
let dateComponents = Calendar.current.dateComponents(Set(descendingOrderedComponents), from: oldDate, to: newDate)
let arrayOfTuples = descendingOrderedComponents.map { ($0, dateComponents.value(for: $0)) }
for (component, value) in arrayOfTuples {
if let value = value, value > 0 {
print(component, value) // prints hour 4
break
}
}
이 작업을 반복해야하는 경우 코드를 리팩터링 할 수 있습니다.
import Foundation
extension Date {
func offset(from: Date) -> (Calendar.Component, Int)? {
let descendingOrderedComponents = [Calendar.Component.year, .month, .day, .hour, .minute]
let dateComponents = Calendar.current.dateComponents(Set(descendingOrderedComponents), from: from, to: self)
let arrayOfTuples = descendingOrderedComponents.map { ($0, dateComponents.value(for: $0)) }
for (component, value) in arrayOfTuples {
if let value = value, value > 0 {
return (component, value)
}
}
return nil
}
}
let oldDate = Date(timeIntervalSinceReferenceDate: -16200)
let newDate = Date(timeIntervalSinceReferenceDate: 0)
if let (component, value) = newDate.offset(from: oldDate) {
print(component, value) // prints hour 4
}
NSDateComponentsFormatter
. 매우 구성하기 쉬우므로 적절하게 간결한 결과를 얻을 수 있습니다 (예 :).maximumUnitCount = 1
.