स्विफ्ट 3 के साथ, अपनी आवश्यकताओं के अनुसार, आप अपनी समस्या को हल करने के लिए निम्नलिखित दो तरीकों में से एक चुन सकते हैं।
1. उपयोगकर्ता को दो तिथियों के बीच का अंतर प्रदर्शित करें
आप DateComponentsFormatterअपने ऐप के इंटरफ़ेस के लिए स्ट्रिंग्स बनाने के लिए उपयोग कर सकते हैं । निम्नलिखित घोषणा के साथ DateComponentsFormatterएक maximumUnitCountसंपत्ति है:
var maximumUnitCount: Int { get set }
परिणामी स्ट्रिंग में प्रदर्शित इकाइयों की संख्या को सीमित करने के लिए इस संपत्ति का उपयोग करें। उदाहरण के लिए, इस संपत्ति के साथ "1h 10m, 30s" के बजाय 2 सेट करें, जिसके परिणामस्वरूप स्ट्रिंग "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 घंटे के रूप में प्रदर्शित किया जाएगा ।
यदि आपको इस ऑपरेशन को दोहराने की आवश्यकता है, तो आप अपने कोड को रिफलेक्टर कर सकते हैं:
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
}
}
यदि आपको इस ऑपरेशन को दोहराने की आवश्यकता है, तो आप अपने कोड को रिफलेक्टर कर सकते हैं:
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)।