ด้วย Swift 3 ตามความต้องการของคุณคุณสามารถเลือกหนึ่งในสองวิธีต่อไปนี้เพื่อแก้ไขปัญหาของคุณ
1. แสดงความแตกต่างระหว่างวันที่สองวันกับผู้ใช้
คุณสามารถใช้ a DateComponentsFormatter
เพื่อสร้างสตริงสำหรับอินเทอร์เฟซของแอปได้ DateComponentsFormatter
มีmaximumUnitCount
คุณสมบัติที่มีการประกาศดังต่อไปนี้:
var maximumUnitCount: Int { get set }
ใช้คุณสมบัตินี้เพื่อ จำกัด จำนวนหน่วยที่แสดงในสตริงผลลัพธ์ ตัวอย่างเช่นเมื่อตั้งค่าคุณสมบัตินี้เป็น 2 แทนที่จะเป็น“ 1h 10m, 30s” สตริงผลลัพธ์จะเป็น“ 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 ชั่วโมง
หากคุณต้องการทำซ้ำการดำเนินการนี้คุณสามารถ refactor รหัสของคุณ:
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
}
}
หากคุณต้องการทำซ้ำการดำเนินการนี้คุณสามารถ refactor รหัสของคุณ:
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
)