Dengan Swift 3, sesuai dengan kebutuhan Anda, Anda dapat memilih salah satu dari dua cara berikut untuk menyelesaikan masalah Anda.
1. Tampilkan perbedaan antara dua tanggal untuk pengguna
Anda dapat menggunakan a DateComponentsFormatteruntuk membuat string untuk antarmuka aplikasi Anda. DateComponentsFormattermemiliki maximumUnitCountproperti dengan deklarasi berikut:
var maximumUnitCount: Int { get set }
Gunakan properti ini untuk membatasi jumlah unit yang ditampilkan dalam string yang dihasilkan. Misalnya, dengan properti ini disetel ke 2, alih-alih “1h 10m, 30s”, string yang dihasilkan adalah “1h 10m”. Gunakan properti ini ketika Anda dibatasi untuk ruang atau ingin mengumpulkan nilai ke unit besar terdekat.
Dengan menetapkan maximumUnitCountnilai ke 1, Anda dijamin untuk menampilkan perbedaan hanya dalam satu DateComponentsFormatterunit (tahun, bulan, hari, jam atau menit).
Kode Playground di bawah ini menunjukkan cara menampilkan perbedaan antara dua tanggal:
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")
Perhatikan bahwa DateComponentsFormatterkumpulkan hasilnya. Oleh karena itu, perbedaan 4 jam dan 30 menit akan ditampilkan sebagai 5 jam .
Jika Anda perlu mengulangi operasi ini, Anda dapat mengubah kode Anda:
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. Dapatkan perbedaan antara dua tanggal tanpa memformat
Jika Anda tidak perlu menampilkan dengan memformat perbedaan antara dua tanggal ke pengguna, Anda dapat menggunakan Calendar. Calendarmemiliki metode dateComponents(_:from:to:)yang memiliki deklarasi berikut:
func dateComponents(_ components: Set<Calendar.Component>, from start: Date, to end: Date) -> DateComponents
Mengembalikan perbedaan antara dua tanggal.
Kode Playground di bawah ini yang menggunakan dateComponents(_:from:to:)menunjukkan cara mengambil perbedaan antara dua tanggal dengan mengembalikan perbedaan hanya dalam satu jenis Calendar.Component(tahun, bulan, hari, jam atau menit).
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
}
}
Jika Anda perlu mengulangi operasi ini, Anda dapat mengubah kode Anda:
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. Ini sangat dapat dikonfigurasi, memungkinkan Anda untuk mendapatkan hasil singkat yang tepat (misalnya.maximumUnitCount = 1).