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
DateComponentsFormatterUygulamanızın arayüzü için dizeler oluşturmak üzere a kullanabilirsiniz . aşağıdaki beyanda DateComponentsFormatterbulunan bir maximumUnitCountmü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")
DateComponentsFormatterSonucu 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 Calendarsahip 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).