NSDates के बीच सेकंड में अंतर का पता लगाएं, स्विफ्ट का उपयोग करके पूर्णांक के रूप में


96

मैं एक कोड कोड लिख रहा हूं, जहां मैं समय चाहता हूं कि एक बटन को कितनी देर तक दबाए रखा जाए। ऐसा करने के लिए मैंने NSDate()बटन दबाए जाने पर रिकॉर्ड किया , और timeIntervalSinceDateबटन के जारी होने पर फ़ंक्शन का उपयोग करने का प्रयास किया। यह काम करने लगता है लेकिन मुझे परिणाम प्रिंट करने या इसे पूर्णांक में बदलने का कोई तरीका नहीं मिल रहा है।

var timeAtPress = NSDate() 

@IBAction func pressed(sender: AnyObject) {
    println("pressed")
    timeAtPress = NSDate()
}

@IBAction func released(sender: AnyObject) {
    println("released")
    var elapsedTime = NSDate.timeIntervalSinceDate(timeAtPress)
    duration = ???
}

मैंने कुछ इसी तरह के प्रश्न देखे हैं, लेकिन मुझे C नहीं पता है इसलिए मुझे दिए गए उत्तरों को समझने में कठिन समय था। यदि यह पता लगाने के लिए अधिक कुशल तरीका है कि बटन को कितनी देर तक नीचे रखा गया था तो मैं सुझावों के लिए खुला हूं। अग्रिम में धन्यवाद।

जवाबों:


211

गणना करने का आपका प्रयास elapsedTimeगलत है। स्विफ्ट 3 में, यह होगा:

let elapsed = Date().timeIntervalSince(timeAtPress)

संदर्भ के ()बाद ध्यान दें DateDate()एक नई तिथि वस्तु को दर्शाता है, और उसके बाद timeIntervalSinceकि और के बीच समय अंतर देता है timeAtPress। वह फ्लोटिंग पॉइंट वैल्यू (तकनीकी रूप से, a TimeInterval) लौटाएगा ।

यदि आप चाहते हैं कि Intमान को छोटा कर दिया जाए , तो आप इसका उपयोग कर सकते हैं:

let duration = Int(elapsed)

और, BTW, timeAtPressवैरिएबल की आपकी परिभाषा को किसी Dateऑब्जेक्ट को तुरंत करने की आवश्यकता नहीं है । मुझे लगता है कि आप का इरादा:

var timeAtPress: Date!

यह चर को एक चर के रूप में परिभाषित करता है Date(एक स्पष्ट रूप से अपरिवर्तित एक), लेकिन आप उस चर के वास्तविक तात्कालिकता को तब तक सुरक्षित रखेंगे जब तक pressedकि उसे बुलाया न जाए।


वैकल्पिक रूप से, मैं अक्सर उपयोग करता हूं CFAbsoluteTimeGetCurrent(), जैसे,

var start: CFAbsoluteTime!

और जब मैं सेट करना चाहता हूं startTime, तो मैं निम्नलिखित कार्य करता हूं:

start = CFAbsoluteTimeGetCurrent()

और जब मैं बीते हुए सेकंड की संख्या की गणना करना चाहता हूं, तो मैं निम्नलिखित करता हूं:

let elapsed = CFAbsoluteTimeGetCurrent() - start

यह ध्यान देने योग्य है कि CFAbsoluteTimeGetCurrentप्रलेखन हमें चेतावनी देता है:

इस फ़ंक्शन के लिए बार-बार कॉल करने से नीरस रूप से बढ़ते परिणामों की गारंटी नहीं मिलती है। बाहरी समय संदर्भों के साथ सिंक्रनाइज़ेशन या घड़ी के स्पष्ट उपयोगकर्ता परिवर्तन के कारण सिस्टम का समय घट सकता है।

इसका मतलब है कि यदि आप दुर्भाग्यपूर्ण समय को मापने के लिए पर्याप्त हैं, जब इनमें से एक समायोजन होता है, तो आप गलत बीते समय की गणना के साथ समाप्त हो सकते हैं। यह NSDate/ Dateगणना के लिए भी सही है। एक mach_absolute_timeआधारित गणना (सबसे आसानी से किया जाने वाला CACurrentMediaTime) का उपयोग करना सबसे सुरक्षित है :

let start = CACurrentMediaTime()

तथा

let elapsed = CACurrentMediaTime() - start

यह उपयोग करता है mach_absolute_time, लेकिन तकनीकी क्यू एंड ए QA1398 में उल्लिखित इसकी कुछ जटिलताओं से बचा जाता है ।

याद रखें, हालांकि, कि CACurrentMediaTime/ mach_absolute_timeजब डिवाइस रिबूट है रीसेट हो जाएगा। इसलिए, निचली रेखा, यदि आपको किसी ऐप के चलने के दौरान सटीक बीता हुआ समय गणना की आवश्यकता है, तो उपयोग करें CACurrentMediaTime। लेकिन अगर आप इस शुरुआती समय को लगातार स्टोरेज में सेव करने जा रहे हैं, जिसे आप भविष्य की तारीख में ऐप के फिर से शुरू होने पर याद कर सकते हैं, तो आपको इसका उपयोग करना होगा , Dateया CFAbsoluteTimeGetCurrentबस किसी भी तरह की अशुद्धि के साथ रहना होगा जो प्रवेश कर सकता है।


4
वाह, धन्यवाद रॉब! आपका उत्तर बेहद मददगार और समझने में आसान था। मैं वास्तव में CFAbsoluteTime के बारे में टिप की सराहना करता हूं। मैं निश्चित रूप से उपयोग करेंगे!
एरिक

क्या समय के लिए आयाम है IntervalSinceDate?
यूजीन

यह एक रिटर्न देता है TimeInterval, जिसे सेकंड में मापा जाता है।
राब

22

NSDate () और NSCalendar () एक अच्छे विकल्प की तरह लगते हैं। कैलेंडर गणना का उपयोग करें और वास्तविक गणित भाग को फ्रेमवर्क पर छोड़ दें। यहाँ दो के बीच सेकंड प्राप्त करने का एक त्वरित उदाहरण हैNSDate()

let startDate = NSDate()
let endDate = NSDate()
let calendar = NSCalendar.currentCalendar()
let dateComponents = calendar.components(NSCalendarUnit.CalendarUnitSecond, fromDate: startDate, toDate: endDate, options: nil)
let seconds = dateComponents.second
println("Seconds: \(seconds)")

किसी कारण से यह हमेशा मेरे लिए 0 लौटता है, भले ही तारीखें एक घंटे अलग हों।
मार्करम

10

फ्रेडी के उत्तर के अनुसार, यह स्विफ्ट 3 में कार्य है:

let start = Date()
let end = Date(timeIntervalSince1970: 100)
let calendar = Calendar.current
let unitFlags = Set<Calendar.Component>([ .second])
let datecomponents = calendar.dateComponents(unitFlags, from: start, to: end)
let seconds = datecomponents.second
print(String(describing: seconds))

1
धन्यवाद @ लैगमास्टर। खुश देखने के लिए स्विफ्ट एनएस उपसर्ग के साथ दूर कर रही है।
फ्रेडी

4

स्विफ्ट 5

let differenceInSeconds = Int(endDate.timeIntervalSince(startDate))

0

इस तरह आप स्विफ्ट 3 के नवीनतम संस्करण में अंतर पा सकते हैं

let calendar = NSCalendar.current
var compos:Set<Calendar.Component> = Set<Calendar.Component>()
compos.insert(.second)
compos.insert(.minute)
let difference = calendar.dateComponents(compos, from: fromDate, to: toDate)
print("diff in minute=\(difference.minute!)") // difference in minute
print("diff in seconds=\(difference.second!)") // difference in seconds

संदर्भ: दो एनएसडी के बीच अंतर प्राप्त करना (महीने / दिन / घंटे / मिनट / सेकंड)


-1

स्विफ्ट 5

    let startDate = Date()
    let endDate = Date()
    let calendar = Calendar.current
    let dateComponents = calendar.compare(startDate, to: endDate, toGranularity: .second)
    let seconds = dateComponents.rawValue
    print("Seconds: \(seconds)")

2
यह कोड में केवल कुछ सेकंड में अंतर प्रदान नहीं करता है, फिर चाहे शुरुआत अधिक हो या न हो।
अरुण के

-6

"Hh: mm" में 2 समय के बीच स्विफ्ट 3 सेकंड के लिए

func secondsIn(_ str: String)->Int{
    var strArr = str.characters.split{$0 == ":"}.map(String.init)
    var sec = Int(strArr[0])! * 3600
    var sec1 = Int(strArr[1])! * 36
    print("sec")
    print(sec+sec1)
    return sec+sec1

}

प्रयोग

var sec1 = secondsIn(shuttleTime)
var sec2 = secondsIn(dateToString(Date()))
print(sec1-sec2)

यह उत्तर ऑप के उत्तर के लिए अप्रासंगिक है।
टॉमस नाज़ेंको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.