এনএসটাইমে অন্তর্বর্তী থেকে এইচ এইচ: মিমি: এসএস?


85

যদি আমার কাছে এনএসটাইমআইন্টারওয়াল থাকে যা ২০০.০ বলে সেট করা আছে, এটি কি রূপান্তর করার কোনও উপায় আছে 00:03:20, আমি ভাবছিলাম যে আমি এটির সাথে একটি এনএসডিট শুরু করতে পারি এবং তারপরে এইচ এইচ: মিমি: এসএস ব্যবহার করে এনএসডিট ফরমেটার ব্যবহার করতে পারি। আমার প্রশ্ন হ'ল এটি করার কোন দ্রুত উপায় আছে বা আমাকে নিজেই নম্বরটি ভেঙে ব্যবহার করতে হবে [NSString stringWithFormat: %02d:%02d:%02d, myHour, myMin, mySec]?

উত্তর:


198

NSDateFormatterবিভাগ এবং মডুলো ব্যতীত অন্য কিছু ব্যবহার করার দরকার নেই । NSTimeIntervalএটি একটি ডাবলযুক্ত সেকেন্ড মাত্র।

সুইফট

func stringFromTimeInterval(interval: NSTimeInterval) -> String {
    let interval = Int(interval)
    let seconds = interval % 60
    let minutes = (interval / 60) % 60
    let hours = (interval / 3600)
    return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}

উদ্দেশ্য গ

- (NSString *)stringFromTimeInterval:(NSTimeInterval)interval {
    NSInteger ti = (NSInteger)interval;
    NSInteger seconds = ti % 60;
    NSInteger minutes = (ti / 60) % 60;
    NSInteger hours = (ti / 3600);
    return [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)hours, (long)minutes, (long)seconds];
}

অনেক প্রশংসা করা হয়েছে, আমি যা ভাবছিলাম তা জানায় তবে আমি কেবল এটি যাচাই করতে চেয়েছিলাম যে আমি iOS এসডিকে অংশ হিসাবে ইতিমধ্যে অন্তর্ভুক্ত থাকা কিছু মিস করছি না।
ফিজিগোট

4
আমি উল্লেখ করতে চাই যে ":" কেবল ইংরেজী এবং কিছু অন্যান্য ভাষায় ডিলিমিটার হিসাবে কাজ করে। ফিনিশ, উদাহরণস্বরূপ, "ব্যবহার করে।" - এই "15.02.59" এর মত
শাওশা

@ এসগোশা ঠিক হ'ল অ্যাপল এগুলির জন্য বিন্যাস সরবরাহ করে। ফর্ম্যাট করার জন্য আমি কি পরিবর্তে কোনও স্থানীয় স্ট্রিং ব্যবহার করব?
গেরি শ

20
এটি ভুল উত্তর কারণ এটি ডিলিমিটারটিকে স্থানীয়করণ করে না (অন্যান্য মন্তব্যের উল্লেখ হিসাবে)। NSDateCompomentsFormatter ব্যবহার করে আপনি সঠিকভাবে একটি একক লাইন আপনার সময় বিরতি, যেমন ফরম্যাট করতে পারেন NSDateComponentsFormatter().stringFromTimeInterval(NSTimeInterval(duration))দ্রুতগতি মধ্যে
ইলিয়াস করিম

4
স্থানীয়করণ এবং ভবিষ্যতের প্রুফিংয়ের জন্য, সঠিক সমাধানটি হ'ল @jrc দ্বারা বর্ণিত NSDateComponents Formatter ব্যবহার করুন
voidref

103

আইওএস 8 এ, ব্যবহার করুন NSDateComponentsFormatter

NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);

ফলাফল "3:20" :20

NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);

আউটপুটগুলি "0:03:20"।


4
সুন্দর আপডেট। তবে যদি এটি সত্যিই কেবল একটি সাধারণ গণনা হয় তবে এই বিষয়গুলি একটি বিশাল ওভারহেড ব্যবহার করবে না (যতক্ষণ না কোনও গতিশীল বিন্যাস জড়িত না থাকে)?
জুলিয়ান এফ ওয়েইনার্ট

4
বিভিন্ন লোকেল ইত্যাদির জন্য স্ট্রিংটি সঠিকভাবে উপস্থিত হয় তা নিশ্চিত করার জন্য আপনার ফর্ম্যাটিংটি প্রয়োজন
ম্যাক ম্যাকলিড

সত্যিই ক্ষুদ্র মন্তব্য, তবে অবজেক্টিভ সি প্রশ্নের জন্য সি ফাংশনের উদাহরণ দেওয়া অদ্ভুত is সম্ভবত এটি ObjectiveC বিন্যাসে পরিবর্তন মূল্য?
Rilakkuma


17

Onmyway133 এর উত্তরের সুইফ্ট 3 সংস্করণ :

import Foundation

func format(_ duration: TimeInterval) -> String {
    let formatter = DateComponentsFormatter()
    formatter.zeroFormattingBehavior = .pad
    formatter.allowedUnits = [.minute, .second]

    if duration >= 3600 {
        formatter.allowedUnits.insert(.hour)
    }

    return formatter.string(from: duration)!
}


print(format(12)) // 0:12
print(format(65)) // 1:05
print(format(1750)) // 29:10
print(format(3890)) // 1:04:50
print(format(45720)) // 12:42:00

একটি ডেটফর্মেটর বা নাম্বার ফর্ম্যাটারের মতো কোনও ডেটকম্পোনেন্টস ফরমেটারটি ব্যয়বহুল পারফরম্যান্সের মতো তৈরি করা হয়?
মোশে

4
এর পরিবর্তে এক ঘন্টার মান আছে কিনা পরীক্ষণ, সেটিং zeroFormattingBehaviorহতে [.dropLeading, .pad]একটি উন্নততর (কম কোড) বিকল্প হতে পারে।
ম্যাডডেইসনে ২৮:৪7

মন্তব্যগুলি ভুল বলে মনে হচ্ছে। এই কোডটির ফলাফল: 00:12, 01:05, 29:10, 01:04:50, 12:42:00
জর্ডান এইচ

10

কোডের অতিরিক্ত কিছু লাইন, তবে আমি অনুভব করি যে এনএসডিটকম্পন্টগুলি ব্যবহার করা আরও একটি সুনির্দিষ্ট মান দেবে।

- (NSString *)getTimeRepresentationFromDate:(NSDate *)iDate withTimeInterval:(NSTimeInterval)iTimeInterval {
    NSString *aReturnValue = nil;
    NSDate *aNewDate = [iDate dateByAddingTimeInterval:iTimeInterval]; 

    unsigned int theUnits = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSCalendar *aCalender = [NSCalendar currentCalendar];
    NSDateComponents *aDateComponents = [aCalender components:theUnits fromDate:iDate toDate:aNewDate options:0];

    aReturnValue = [NSString stringWithFormat:@"%d:%d:%d", [aDateComponents hour], [aDateComponents minute], [aDateComponents second]];

    return aReturnValue;
}

উপরোক্ত পদ্ধতিতে 2 তারিখ ব্যবহার করে টাইমআইন্টারভাল তৈরি করা হয়। আপনি ডিফল্ট মান হিসাবে আইডিট প্যারামিটারে [এনএসডিট তারিখ] পাস করতে পারেন।
রোশিত

4
@ ম্যাথিয়া-বাউচের যে পদ্ধতিটি ব্যবহার করা হয়েছে তার চেয়ে এই "আরও সুনির্দিষ্ট" কীভাবে?
জেবি

4
এই পদ্ধতির সাহায্যে আপনি সেকেন্ডে, ঘন্টা, মিনিটে অর্থাত্ 60 এর নিরিখে সময় পাবেন তবে @ ম্যাথিয়াস-বাউচের উত্তর আপনাকে দশমিক হিসাবে বিবেচনা করবে উদাহরণস্বরূপ আপনি যদি যথেষ্ট সময় অপেক্ষা করেন আপনি 2 মিনিট 19 সেকেন্ডের পরিবর্তে 1 মিনিট 79 সেকেন্ড দেখতে পাবেন
আশীষ পাইসে

এটি গৃহীত সমাধানের চেয়ে অনেক ভাল সমাধান। ":" এর ব্যবহার এখনও আন্তর্জাতিকীকরণের জন্য সমস্যা, তবে অন্তত লিপ দিন এবং দিবালোকের সঞ্চয় সীমানা জুড়ে এটি শক্ত।
ইভানফ্ল্যাশ

@ আশিসপিসি মডুলো অপারেটর ৫৯ এর চেয়ে বড় যে কোনও কিছুকে আটকাচ্ছে।
ম্যাথিয়াস বাউচ

8

ইন সুইফট 2 , আইওএস 8+ । এটি নিশ্চিত করে যে আমরা যখন প্রয়োজন তখন কেবল ঘন্টাটি দেখাই

func format(duration: NSTimeInterval) -> String {
  let formatter = NSDateComponentsFormatter()
  formatter.zeroFormattingBehavior = .Pad

  if duration >= 3600 {
    formatter.allowedUnits = [.Hour, .Minute, .Second]
  } else {
    formatter.allowedUnits = [.Minute, .Second]
  }

  return formatter.stringFromTimeInterval(duration) ?? ""
}

সুতরাং তোমার আছে

print(format(12)) // 0:12
print(format(65)) // 1:05
print(format(1750)) // 29:10
print(format(3890)) // 1:04:50
print(format(45720)) // 12:42:00


4

সুইফট 4

DateComponentsFormatter().string(from: <# TimeInterval #>)

প্রাক্তন:

DateComponentsFormatter().string(from: 59.0)

3

মাথিয়াস বাউচের পরামর্শকে "প্রসারিত" করতে, সুইফ্টে আমি এটিকে এনএসটাইম ইন্টারভাল এর একটি গণিত সম্পত্তি হিসাবে তৈরি করব:

extension NSTimeInterval {
  var stringValue: String {
    let interval = Int(self)
    let seconds = interval % 60
    let minutes = (interval / 60) % 60
    let hours = (interval / 3600)
    return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
  }
}

এর সুবিধাটি হ'ল এটি NSTimeIntervalটাইপের সাথে সংযুক্ত , আপনার ভিউ কন্ট্রোলার বা অন্য যে কোনও জায়গায় আপনি এই ফাংশনটি রাখেন না। আপনি কিছু যেতে চাই ব্যবহার করতে:

let timeInterval = NSDate().timeIntervalSinceDate(start)        
self.elapsedTimeLabel.text = timeInterval.stringValue

ধন্যবাদ, কেনি! আমার ক্ষেত্রে আমার এগুলি পৃথকভাবে প্রয়োজন ছিল, তাই আমি আপনার এক্সটেনশনে অতিরিক্ত ভেরিয়েবলগুলি যুক্ত করেছি: "বার সেকেন্ড: অন্তর = আন্তঃ = স্ব (স্ব); সেকেন্ড = ইন্টারভেল% 60; সেকেন্ডে ফেরত দিন}" এবং এভাবে কয়েক মিনিট এবং ঘন্টার জন্য। সুতরাং যে ব্যবহারটি হবে: মুদ্রণ ("মিনিট সময় ব্যয়: (সময়Interval.minutes)")
Vitalii

3

@ Onmyway133 এর উত্তরের ভিত্তিতে এখানে সুইফট 4 সংস্করণ রয়েছে:

func format(duration: TimeInterval) -> String {
    let formatter = DateComponentsFormatter()
    formatter.zeroFormattingBehavior = .pad

    if duration >= 3600 {
        formatter.allowedUnits = [.hour, .minute, .second];
    } else {
        formatter.allowedUnits = [.minute, .second];
    }

    return formatter.string(from: duration) ?? "";
}

0

সরাসরি আপেল ডক্স থেকে: এইচ ফাইলে:

 @property(strong,nonatomic)NSDateComponentsFormatter *timerFormatter;

এম ফাইলে

@synthesize timerFormatter;

- (void)viewDidLoad {
[super viewDidLoad];
NSDateComponentsFormatter *timerFormatter = [[NSDateComponentsFormatter alloc] init];
timerFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional; 
//10:59 Positional THIS ONE DOES NOT SEEM TO WORK iOS<9 WHEN <1Minute JUST SHOWS 01, 10m 59s Abbreviated, 10min 59sec Short, 10minutes 59seconds Full ...
timerFormatter.allowedUnits = NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
}

আপনার যেখানেই আপনার NSTime অন্তর্কালীন সময়কাল অন্তর্বর্তী এইচ: মিমি: এসএস স্ট্রিংয়ে রূপান্তর করতে হবে, এটি করুন:

NSString *txt=[timerFormatter stringFromTimeInterval:timeInterval];

0

আমার ধারণা, টাইমার ভগ্নাংশটি সিল আউট করা উচিত। ম্যাথিয়াসের কোডটি যেহেতু কয়েক সেকেন্ডে এই সমস্যাটি তৈরি করছে, আমি মাথিয়াসের থেকে সামান্য পরিবর্তিত নিম্নলিখিতটি ব্যবহার করি

    - (NSString *)stringFromTimeInterval:(NSTimeInterval)interval {
        int ti = (int) ceil(interval);
        int seconds = ti % 60;
        int minutes = (ti / 60) % 60;
        int hours = (ti / 3600);
        return [NSString stringWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds];
    }

0

Onmyway133 এর উত্তরের উদ্দেশ্য সি সংস্করণ

- (NSString*) formatTimeInterval:(NSTimeInterval) timeInterval {

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

    formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;

    if (timeInterval > 3600) {
        formatter.allowedUnits = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    } else {
        formatter.allowedUnits = NSCalendarUnitMinute | NSCalendarUnitSecond;
    }

    return [formatter stringFromTimeInterval:timeInterval];
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.