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 DateComponentsFormatter
untuk membuat string untuk antarmuka aplikasi Anda. DateComponentsFormatter
memiliki maximumUnitCount
properti 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 maximumUnitCount
nilai ke 1
, Anda dijamin untuk menampilkan perbedaan hanya dalam satu DateComponentsFormatter
unit (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 DateComponentsFormatter
kumpulkan 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
. Calendar
memiliki 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
).