Swift 3 ile, ihtiyaçlarınıza göre, sorununuzu çözmek için aşağıdaki iki yoldan birini seçebilirsiniz.
1. Kullanıcıya iki tarih arasındaki farkı görüntüleyin
DateComponentsFormatter
Uygulamanızın arayüzü için dizeler oluşturmak üzere a kullanabilirsiniz . aşağıdaki beyanda DateComponentsFormatter
bulunan bir maximumUnitCount
mülke sahiptir:
var maximumUnitCount: Int { get set }
Sonuçta elde edilen dizede görüntülenen birim sayısını sınırlamak için bu özelliği kullanın. Örneğin, bu özellik “1s 10m, 30s” yerine 2 olarak ayarlandığında, elde edilen dize “1h 10m” olur. Alan için kısıtlandığınızda veya değerleri en yakın büyük birime yuvarlamak istediğinizde bu özelliği kullanın.
maximumUnitCount
'Nin değerini olarak ayarlayarak 1
, farkı yalnızca birDateComponentsFormatter
biriminde (yıl, ay, gün, saat veya dakika) .
Aşağıdaki Oyun Alanı kodu, iki tarih arasındaki farkın nasıl görüntüleneceğini gösterir:
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
Sonucu tamamladığını unutmayın . Bu nedenle, 4 saat 30 dakika fark 5 saat olarak görüntülenecektir .
Bu işlemi tekrarlamanız gerekirse, kodunuzu yeniden düzenleyebilirsiniz:
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. Biçimlendirme olmadan iki tarih arasındaki farkı alın
İki tarih arasındaki farkı biçimlendirerek görüntülemeniz gerekmiyorsa kullanabilirsiniz Calendar
. aşağıdaki bildirime Calendar
sahip bir yöntemi dateComponents(_:from:to:)
vardır:
func dateComponents(_ components: Set<Calendar.Component>, from start: Date, to end: Date) -> DateComponents
İki tarih arasındaki farkı döndürür.
Aşağıdaki Oyun Alanı kodu dateComponents(_:from:to:)
, yalnızca bir türdeki Calendar.Component
(yıl, ay, gün, saat veya dakika) farkı döndürerek iki tarih arasındaki farkın nasıl alınacağını gösterir .
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
}
}
Bu işlemi tekrarlamanız gerekirse, kodunuzu yeniden düzenleyebilirsiniz:
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
. Çok yapılandırılabilir, böylece doğru sonuçları elde etmenizi sağlar (örn..maximumUnitCount = 1
).