NSTimeInterval (सेकंड) को मिनटों में कैसे परिवर्तित करें


104

मुझे secondsएक निश्चित घटना से एक राशि मिली है । यह एक NSTimeIntervalडेटा प्रकार में संग्रहीत है ।

मैं इसे minutesऔर में बदलना चाहता हूं seconds

उदाहरण के लिए मेरे पास: "326.4" सेकंड है और मैं इसे निम्नलिखित स्ट्रिंग में बदलना चाहता हूं: "5:26"।

इस लक्ष्य को प्राप्त करने का सबसे अच्छा तरीका क्या है?

धन्यवाद।

जवाबों:


147

छद्म कोड:

minutes = floor(326.4/60)
seconds = round(326.4 - minutes * 60)

90
मुझे लगता है कि यह भी ध्यान देने योग्य है कि एक NSTimerInterval सिर्फ दोहरे के लिए एक टाइपफ़ीड है।
14

4
अल्बारेगर का उत्तर देखें - यह ऐसा करने का एक बेहतर तरीका है (अधिक कोड लेकिन अधिक लचीला, बनाए रखने योग्य)
benvolioT

1
हालाँकि यह कोड बहुत महंगा है। सेकंड में एक अवधि के त्वरित रूपांतरण के लिए, यह उत्तर बेहतर है।
२oc पर स्पैसरीकोचेट

2
कृपया ध्यान दें कि यह उत्तर आपको 1:60 की तरह सामान देगा। स्ट्रैटफैन के जवाब को देखें जो सच्चाई के करीब है। लेकिन फर्श और गोल को हटा दें और आपको घर खाली होना चाहिए।
InvulgoSoft

इस टिप्पणी को लिखने के समय नीचे दिए गए मिक मैकलम के उत्तर को मूल एपीआई का उपयोग करके सबसे अधिक अद्यतन और बनाया गया लगता है।
टॉमस नाज़ेंको

183

संक्षिप्त विवरण

  1. ब्रायन रामसे का उत्तर अधिक सुविधाजनक है यदि आप केवल मिनटों में बदलना चाहते हैं।
  2. यदि आप चाहते हैं कि कोको एपीआई आपके लिए करे और अपने NSTimeInterval को न केवल मिनटों में, बल्कि दिनों, महीनों, सप्ताह, आदि में भी रूपांतरित करें ... मुझे लगता है कि यह एक अधिक सामान्य दृष्टिकोण है।
  3. NSCalendar विधि का उपयोग करें:

    • (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts

    • "निर्दिष्ट घटकों का उपयोग करके NSDateCompords ऑब्जेक्ट के रूप में रिटर्न, दो आपूर्ति की तारीखों के बीच का अंतर"। एपीआई प्रलेखन से।

  4. 2 NSDate बनाएं जिसका अंतर NSTimeInterval है जिसे आप कनवर्ट करना चाहते हैं। (यदि आपका NSTimeInterval 2 NSDate की तुलना करने से आता है तो आपको यह कदम करने की आवश्यकता नहीं है, और आपको NSTimeInterval की आवश्यकता भी नहीं है)।

  5. NSDateCompords से अपने उद्धरण प्राप्त करें

नमूना कोड

// The time interval 
NSTimeInterval theTimeInterval = 326.4;

// Get the system calendar
NSCalendar *sysCalendar = [NSCalendar currentCalendar];

// Create the NSDates
NSDate *date1 = [[NSDate alloc] init];
NSDate *date2 = [[NSDate alloc] initWithTimeInterval:theTimeInterval sinceDate:date1]; 

// Get conversion to months, days, hours, minutes
unsigned int unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit;

NSDateComponents *conversionInfo = [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];

NSLog(@"Conversion: %dmin %dhours %ddays %dmoths",[conversionInfo minute], [conversionInfo hour], [conversionInfo day], [conversionInfo month]);

[date1 release];
[date2 release];

ज्ञात पहलु

  • केवल रूपांतरण के लिए बहुत कुछ, आप सही हैं, लेकिन यह है कि एपीआई कैसे काम करता है।
  • मेरा सुझाव: यदि आप NSDate और NSCalendar का उपयोग करके अपने समय के डेटा का प्रबंधन करने के लिए उपयोग किए जाते हैं, तो एपीआई आपके लिए कड़ी मेहनत करेगा।

4
निश्चित रूप से थोड़ा रूपांतरण करने के लिए बहुत अधिक समाधान है, लेकिन यह आरामदायक, मॉड्यूलर और वास्तव में लचीला लगता है, इस नमूना कोड @Albaregar के लिए वोट करें।
रिगो विड्स

2
+1 अच्छे उत्तर के लिए, हालाँकि यह कोड काफी महंगा है।
निक वीवर

1
+1 ... एक चेतावनी। यदि आपको भिन्नात्मक सेकंड को गोल करने की आवश्यकता है, तो कोड की इस शैली का उपयोग करके सावधान रहें। का डिफ़ॉल्ट व्यवहार - [NSCalendar घटक: fromDate: toDate: विकल्प:] उस परिदृश्य में गड़बड़ कर सकता है जहाँ toDate घटक 31.5 सेकंड है (उदाहरण के लिए) fromDate से आगे - वापस आए घटकों में सेकंड फ़ील्ड में 31 होंगे। NSWrapCalendarCompords का एक वैकल्पिक पैरामीटर है, लेकिन (सीमित) प्रयोग के साथ मैंने इसके साथ किया है, यह ऊपर या नीचे चक्कर लगाने के बजाय निकटतम दूसरे के लिए लपेटता है। आपकी माइलेज भिन्न हो सकती है।
डेविड डॉयल

%ldयदि आप 64 बिट मशीन में हैं।
अनूप वैद्य

5
जो लोग इसे (निक वीवर की तरह) पाते हैं, वे सोचते हैं कि कोड ऐसा लगता है कि यह धीमा होगा। यह नहीं है। मैं एक टाइमर ऐप कर रहा हूं और मैंने ब्रायन राम्से (और अन्य) की शैली में कुछ के खिलाफ अल्बेरगर के संस्करण का परीक्षण किया ... और आश्चर्यजनक रूप से, यहां तक ​​कि एक अपेक्षाकृत धीमी डिवाइस (4S) पर 100 गुना एक सेकंड (जो जबरदस्त ओवरकिल है) का मतदान करता है। ) प्रोसेसर उपयोग में 1% से कम अंतर था।
mmc

42

इन सभी की तुलना में वे अधिक जटिल दिखते हैं! समय अंतराल को घंटे, मिनट और सेकंड में बदलने का एक छोटा और मीठा तरीका यहां दिया गया है:

NSTimeInterval timeInterval = 326.4;
long seconds = lroundf(timeInterval); // Since modulo operator (%) below needs int or long

int hour = seconds / 3600;
int mins = (seconds % 3600) / 60;
int secs = seconds % 60;

ध्यान दें कि जब आप एक फ्लोट को इंट में डालते हैं, तो आपको स्वचालित रूप से फर्श मिलता है (लेकिन अगर आप बेहतर महसूस करते हैं तो आप इसे पहले दो में जोड़ सकते हैं :)


बहुत बढ़िया! मैंने रामसे के कोड की कोशिश की, हालांकि यह एक दूसरे से बाहर लगता है।
uplearnedu.com

आप अपने कोड में एक अर्धविराम याद कर रहे हैं, लेकिन यह मुझे इसे ठीक करने के लिए संपादित नहीं करने देगा।
जीफ

मुझे लगता है कि आपका दृष्टिकोण सबसे अच्छा है - सरल, काम हो जाता है, और टिक्स पर "प्रकाश"। उत्तम।
बोनांजाड्राइवर

29

एक ढेर कुंवारी होने के लिए मुझे माफ कर दो ... मुझे यकीन नहीं है कि ब्रायन रामसे के जवाब का जवाब कैसे दिया जाए ...

दौर का उपयोग 59.5 और 59.99999 के बीच दूसरे मूल्यों के लिए काम नहीं करेगा। इस अवधि के दौरान दूसरा मूल्य 60 होगा। इसके बजाय ट्रंक का उपयोग करें ...

 double progress;

 int minutes = floor(progress/60);
 int seconds = trunc(progress - minutes * 60);

1
दरअसल बस फर्श और ट्रंक / राउंड को पूरी तरह से हटा दें। :)
InvulgoSoft

@StratFan क्या आप अपने उत्तर में घंटे जोड़ सकते हैं?
श्मिट

27

यदि आप iOS 8 या OS X 10.10 से ऊपर या ऊपर लक्ष्य बना रहे हैं, तो यह बहुत आसान हो गया है। नई NSDateComponentsFormatterकक्षा आपको NSTimeIntervalउपयोगकर्ता को दिखाने के लिए किसी दिए गए सेकंड में उसके मान को स्थानीयकृत स्ट्रिंग में परिवर्तित करने की अनुमति देती है । उदाहरण के लिए:

उद्देश्य सी

NSTimeInterval interval = 326.4;

NSDateComponentsFormatter *componentFormatter = [[NSDateComponentsFormatter alloc] init];

componentFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
componentFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropAll;

NSString *formattedString = [componentFormatter stringFromTimeInterval:interval];
NSLog(@"%@",formattedString); // 5:26

तीव्र

let interval = 326.4

let componentFormatter = NSDateComponentsFormatter()

componentFormatter.unitsStyle = .Positional
componentFormatter.zeroFormattingBehavior = .DropAll

if let formattedString = componentFormatter.stringFromTimeInterval(interval) {
    print(formattedString) // 5:26
}

NSDateCompnentsFormatterइस आउटपुट को लंबे रूपों में रखने की भी अनुमति देता है। अधिक जानकारी NSHipster के NSFormatter लेख में पाई जा सकती है । और इस बात पर निर्भर करता है कि आप किन वर्गों के साथ पहले से काम कर रहे हैं (यदि नहीं NSTimeInterval), तो फॉर्मेटर को एक उदाहरण NSDateComponents, या दो NSDateवस्तुओं को पास करना अधिक सुविधाजनक हो सकता है , जो निम्न विधियों के माध्यम से भी किया जा सकता है।

उद्देश्य सी

NSString *formattedString = [componentFormatter stringFromDate:<#(NSDate *)#> toDate:<#(NSDate *)#>];
NSString *formattedString = [componentFormatter stringFromDateComponents:<#(NSDateComponents *)#>];

तीव्र

if let formattedString = componentFormatter.stringFromDate(<#T##startDate: NSDate##NSDate#>, toDate: <#T##NSDate#>) {
    // ...
}

if let formattedString = componentFormatter.stringFromDateComponents(<#T##components: NSDateComponents##NSDateComponents#>) {
    // ...
}

यह स्ट्रिंग बनाने का उचित तरीका है, पर्याप्त रूप से स्थानीयकृत
स्विफ्टआर्किटक्ट

1
यह उत्तर स्वीकृत उद्देश्य की तुलना में अधिक "उद्देश्य-सी" और उपयोगी है। आपको इसके साथ switchया if elseबयानों की आवश्यकता नहीं है । NSDateComponentsFormatterयह सब ध्यान रखता है। घंटे, मिनट, सेकंड बिना किसी चिंता के मुद्रित।
rustyMagnet

17

ब्रायन रामसे का कोड, डे-स्यूडोफाइड:

- (NSString*)formattedStringForDuration:(NSTimeInterval)duration
{
    NSInteger minutes = floor(duration/60);
    NSInteger seconds = round(duration - minutes * 60);
    return [NSString stringWithFormat:@"%d:%02d", minutes, seconds];
}

यह स्थानीयकरण नहीं करता है
स्विफ्टआर्किटेक्ट

7

यहाँ एक स्विफ्ट संस्करण है:

func durationsBySecond(seconds s: Int) -> (days:Int,hours:Int,minutes:Int,seconds:Int) {
    return (s / (24 * 3600),(s % (24 * 3600)) / 3600, s % 3600 / 60, s % 60)
}

इस तरह इस्तेमाल किया जा सकता है:

let (d,h,m,s) = durationsBySecond(seconds: duration)
println("time left: \(d) days \(h) hours \(m) minutes \(s) seconds")

6
    NSDate *timeLater = [NSDate dateWithTimeIntervalSinceNow:60*90];

    NSTimeInterval duration = [timeLater  timeIntervalSinceNow];

    NSInteger hours = floor(duration/(60*60));
    NSInteger minutes = floor((duration/60) - hours * 60);
    NSInteger seconds = floor(duration - (minutes * 60) - (hours * 60 * 60));

    NSLog(@"timeLater: %@", [dateFormatter stringFromDate:timeLater]);

    NSLog(@"time left: %d hours %d minutes  %d seconds", hours,minutes,seconds);

आउटपुट:

timeLater: 22:27
timeLeft: 1 hours 29 minutes  59 seconds

एक तारीख को कवर करने के लिए इसका वास्तव में सही उदाहरण है
ravinder521986

5

चूंकि यह अनिवार्य रूप से एक डबल है ...

60.0 से विभाजित करें और अभिन्न अंग और अंश भाग निकालें।

अभिन्न अंग पूरे मिनट की संख्या होगी।

भिन्नात्मक भाग को 60.0 से फिर से गुणा करें।

परिणाम शेष सेकंड होगा।


3

याद रखें कि मूल प्रश्न एक स्ट्रिंग आउटपुट के बारे में है, न कि छद्म कोड या व्यक्तिगत स्ट्रिंग घटकों के बारे में।

मैं इसे निम्नलिखित स्ट्रिंग में बदलना चाहता हूं: "5:26"

कई उत्तर अंतर्राष्ट्रीयकरण के मुद्दों को याद कर रहे हैं, और अधिकांश गणित की गणना हाथ से कर रहे हैं। सभी सिर्फ 20 वीं सदी ...

गणित स्वयं न करें (स्विफ्ट 4)

let timeInterval: TimeInterval = 326.4
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.unitsStyle = .positional
if let formatted = dateComponentsFormatter.string(from: timeInterval) {
    print(formatted)
}

5:26


पुस्तकालयों पर उत्तोलन

यदि आप वास्तव में व्यक्तिगत घटकों, और सुखद पठनीय कोड चाहते हैं, तो देखें SwiftDate देखें :

import SwiftDate
...
if let minutes = Int(timeInterval).seconds.in(.minute) {
    print("\(minutes)")
}

5


पर्याप्त उपयोग के लिए @mickmaccallum और @polarwar को श्रेयDateComponentsFormatter


0

मैंने स्विफ्ट में यह कैसे किया (इसे "01:23" दिखाने के लिए स्ट्रिंग स्वरूपण सहित):

let totalSeconds: Double = someTimeInterval
let minutes = Int(floor(totalSeconds / 60))
let seconds = Int(round(totalSeconds % 60))        
let timeString = String(format: "%02d:%02d", minutes, seconds)
NSLog(timeString)

0

स्विफ्ट 2 संस्करण

extension NSTimeInterval {
            func toMM_SS() -> String {
                let interval = self
                let componentFormatter = NSDateComponentsFormatter()

                componentFormatter.unitsStyle = .Positional
                componentFormatter.zeroFormattingBehavior = .Pad
                componentFormatter.allowedUnits = [.Minute, .Second]
                return componentFormatter.stringFromTimeInterval(interval) ?? ""
            }
        }
    let duration = 326.4.toMM_SS()
    print(duration)    //"5:26"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.