2015-01-22 8 views
11

से कम अंतराल के लिए गलत स्ट्रिंग देता है IOS 8 पर NSDateComponentsFormatter का उपयोग कर रहा हूं और मैंने stringFromTimeInterval: विधि के कार्यान्वयन में संभावित बग देखा है, लेकिन मैं इसे निश्चित रूप से नहीं कह सकता।NSDateComponentsFormatter stringFromTimeInterval 1 मिनट

यह मैं कैसे फ़ॉर्मेटर की स्थापना की है है:

NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init]; 
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDefault; 
formatter.allowedUnits = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; 
formatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional; 

अब जब मैं stringFromTimeInterval: विधि, फ़ॉर्मेटर रिटर्न या तो 1 या 01, जो स्पष्ट रूप से गलत है, यह होना चाहिए करने के लिए 60 सेकंड से कम कुछ भी पारित 0:XX जैसे कुछ वापस करें।

मैंने यह भी देखा है कि unitsStyle को NSDateComponentsFormatterUnitsStylePositional पर बदलकर विधि सही स्ट्रिंग देता है!

उदाहरण:

unitsStyle = NSDateComponentsFormatterUnitsStylePositional के साथ:

(lldb) po [formatter stringFromTimeInterval:12] 
= "1" 

=> लौट चाहिए "00:12" !!

unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated साथ

:

(lldb) po [formatter stringFromTimeInterval:12] 
= "12 s" 

= सही>!

इससे मुझे लगता है कि यह ऐप्पल के एपीआई के कार्यान्वयन में एक बग है, या क्या मुझे कुछ याद आ रही है?

+0

चेक आउट मेरा उत्तर/नीचे काम के आसपास ... – MiKL

+0

मैं जानता हूँ कि यह समाधान नहीं है, लेकिन अगर यह 60 से कम है तो आप सिर्फ timeInterval से नाव स्ट्रिंग मान सेट कर सकते हैं: अगर (self.timeInterval <60) { stringFromInterval = [NSString stringWithFormat: @ "% 2.0f", self.timeInterval]; } क्या आपने ऐप्पल डेवलपर फ़ोरम में पूछने के लिए सहमति दी है? – xarly

उत्तर

1

NSDateComponentsFormatterZeroFormattingBehaviorDefault का अर्थ पोजिशनल इकाइयों की शैली के लिए अग्रणी शून्य, पैड अन्य शून्य ड्रॉप करना है।

उदा। आपके कोड में अनुमत मानों के साथ, [फॉर्मेटर स्ट्रिंगफ्रेमटाइम इंटरवल: 120] परिणाम "0 डी 0:02:00", के बजाय "2:00" है क्योंकि फ़ॉर्मेटर ऑब्जेक्ट ने सभी प्रमुख शून्य मान हटा दिए हैं।

आप शून्य मान स्थानों आरक्षित करना चाहते हैं, तो आप क्यों लिए NSDateComponentsFormatterZeroFormattingBehaviorNone

उपयोग कर सकते हैं [फ़ॉर्मेटर stringFromTimeInterval: 12] परिणाम 1 है, मैं फ़ॉर्मेटर वस्तु पाता है "12" अकेले अस्पष्ट है क्योंकि यह कोई अनुगामी है लगता है उदाहरण के लिए "1 डी" जैसे अर्थ के लिए मान या संकेतक।

9

यह अभी भी आईओएस 8.3 और एक्सकोड 6.3 के साथ एक मुद्दा है। इसके आसपास काम करने का एक तरीका है, हालांकि, यदि सही नहीं है, तो कम से कम आपको प्रासंगिक प्रारूपों को अलग-अलग समय के साथ निपटने के बिना उचित स्वरूपण प्राप्त करने की अनुमति मिलती है।

यहाँ स्विफ्ट में एक उदाहरण वैकल्पिक हल (जो आप एक खेल का मैदान में परीक्षण कर सकते हैं)

let formatter = NSDateComponentsFormatter() 
formatter.unitsStyle = .Positional 
formatter.zeroFormattingBehavior = .Pad 
formatter.allowedUnits = .CalendarUnitMinute | .CalendarUnitSecond 

let string = formatter.stringFromTimeInterval(4) कॉलिंग प्रिंट होगा "00:04" है।

कॉलिंग let string = formatter.stringFromTimeInterval(88) "01:28" प्रिंट करेगा।

अब आप allowedUnits के साथ खेल सकते हैं कि आपके पास 1 घंटा या 1 दिन से अधिक है या नहीं।एक वर्ग है जो एक formatter संपत्ति है में उदाहरण के लिए:

func updateTimeFormatterForTime(time: NSTimeInterval) { 
    if time > 3600 && time < 24 * 3600 { 
     self.formatter.allowedUnits = .CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond 
    } else if time > 24 * 3600 { 
     self.formatter.allowedUnits = .CalendarUnitDay | .CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond 
    } 
} 
+0

CalendarUnitMinute और .CalendarUnitHour, ये 9.1 में अब मौजूद नहीं हैं I मुझे नहीं लगता है या शायद उन्होंने कभी नहीं किया है या मुझे नहीं पता कि उन्हें कहां मिलना है। मैं उन्हें किसी कारण से अनुमति देने के लिए असाइन नहीं कर सकता हूं और वे कम से कम अब नहीं, NSDateComponentsFormatter का हिस्सा नहीं हैं। –

+0

'.CalendarUnitMinute' et al अब '.Minute' आदि हैं। उन्हें हटा नहीं दिया गया है। – squarefrog

0

कैसे इस समारोह के बारे में: 59:04 (मिमी: मिनट: सेकंड) या 09:01 इस स्वरूपित स्ट्रिंग में

func stringFromTimeInterval(interval: NSTimeInterval) -> String { 
    let ti: Int = Int(interval) 
    let seconds: Int = ti % 60 
    let minutes: Int = (ti/60) % 60 
    let hours: Int = (ti/3600) 
    var time: String? = nil 
    if hours > 0 { 
     time = String(format: "%02i:%02i:%02i", hours, minutes, seconds) 
    } 
    else { 
     time = String(format: "%02i:%02i", minutes, seconds) 
    } 
    return time! 
} 

रिटर्न समय: 34 (hh: mm: ss)

संबंधित मुद्दे