2014-10-28 6 views
57

का उपयोग करके एनएसडीएट्स के बीच पूर्णांक के रूप में सेकंड में अंतर खोजें मैं कोड का एक टुकड़ा लिख ​​रहा हूं जहां मैं समय बिताना चाहता हूं कि बटन कितना समय लगेगा। ऐसा करने के लिए जब बटन दबाया गया था तो मैंने 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 = ??? 
} 

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

उत्तर

118

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

let elapsed = Date().timeIntervalSince(timeAtPress) 

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

यदि आप चाहते हैं कि के रूप में एक Int मूल्य तक छोटा कर दिया, तो आप सिर्फ उपयोग कर सकते हैं:

let duration = Int(elapsed) 

और, Btw, timeAtPress चर की अपनी परिभाषा एक Date वस्तु का दृष्टांत की जरूरत नहीं है। मुझे लगता है आप का इरादा:

var timeAtPress: Date! 

यह एक Date चर के रूप में चर (एक परोक्ष एक unwrapped) को परिभाषित करता है, लेकिन आप शायद उस चर की वास्तविक इन्स्टेन्शियशन स्थगित चाहते हैं जब तक 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 का उपयोग करता है, लेकिन इसकी जटिलताओं Technical Q&A QA1398 में उल्लिखित में से कुछ बचा जाता है।

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

+3

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

+0

समय के लिए आयाम क्या है अंतरालसेन्सडेट? – eugene

+1

यह एक ['NSTimeInterval'] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/index.html#//apple_ref/c/tdef/NSTimeInterval) देता है , जिसे सेकंड की संख्या के रूप में मापा जाता है। – Rob

19

एनएसडीएटी() और एनएससीएंडरडर() अच्छी पसंद की तरह ध्वनि। कैलेंडर गणना का उपयोग करें और वास्तविक गणित भाग को ढांचे में छोड़ दें। यहाँ में दो 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)") 
-5

के लिए स्विफ्ट 3 सेकंड के बीच 2 समय के बीच सेकंड होने का एक त्वरित उदाहरण है "hh: mm"

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) 
+0

यह उत्तर op के उत्तर के लिए अप्रासंगिक है। –

0

इस प्रकार आप स्विफ्ट 3

के नवीनतम संस्करण में अंतर प्राप्त कर सकते हैं 0
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 

संदर्भ: Getting the difference between two NSDates in (months/days/hours/minutes/seconds)

2

फ्रेडी के जवाब के साथ अनुसार, इस तेजी से 3 में समारोह है:

let start = Date() 
     let enddt = Date(timeIntervalSince1970: 100) 
     let calendar = Calendar.current 
     let unitFlags = Set<Calendar.Component>([ .second]) 
     let datecomponenets = calendar.dateComponents(unitFlags, from: start, to: enddt) 
     let seconds = datecomponenets.second 
     print("Seconds: \(seconds)") 
+0

धन्यवाद @ लैगमास्टर। तेजी से देखने के लिए खुश एनएस उपसर्ग के साथ काम कर रहा है। – Freddy