কীভাবে কোনও এনএসটাইমআইন্টারওয়াল (সেকেন্ড) মিনিটে রূপান্তর করবেন


104

আমি secondsএকটি নির্দিষ্ট ইভেন্ট থেকে পাস যে পরিমাণ পেয়েছি । এটি একটি NSTimeIntervalডেটা ধরণে সঞ্চিত ।

আমি তা রূপান্তর করতে চান minutesএবং seconds

উদাহরণস্বরূপ আমার কাছে রয়েছে: "326.4" সেকেন্ড এবং আমি এটিকে নিম্নলিখিত স্ট্রিংয়ে রূপান্তর করতে চাই: "5:26"।

এই লক্ষ্য অর্জনের সর্বোত্তম উপায় কী?

ধন্যবাদ।

উত্তর:


147

সুডোকোড:

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

90
আমি মনে করি এটি উল্লেখ করার মতোও যে একটি এনএসটিমিয়ারআইন্টারওয়াল কেবল দ্বিগুণ জন্য টাইপডেফ।
আর্মেন্টেজ

4
আলবারেকারের উত্তর দেখুন - এটি করার আরও ভাল উপায় (আরও কোড তবে আরও নমনীয়, রক্ষণাবেক্ষণযোগ্য)
বেনভোলিওট

1
যদিও কোডটি খুব ব্যয়বহুল। সেকেন্ডের মধ্যে একটি সময়ের জন্য দ্রুত রূপান্তরকরণের জন্য, এই উত্তরটি আরও ভাল।
স্পেসিরিচোচেট

2
দয়া করে মনে রাখবেন যে এই উত্তরটি আপনাকে 1:60 এর মতো জিনিস দেবে। স্ট্র্যাটফ্যানের উত্তরটি দেখুন যা সত্যের কাছাকাছি। তবে মেঝে এবং বৃত্তটি সরিয়ে ফেলুন এবং আপনার বাড়ি থেকে মুক্ত হওয়া উচিত।
ইনভুলগোসফট

এই মন্তব্যটি লেখার সময় নীচে মিক ম্যাকালামের উত্তরটি সম্ভবত সবচেয়ে বেশি আপডেট এবং দেশীয় এপিআই ব্যবহারের পদ্ধতিতে তৈরি বলে মনে হচ্ছে।
টমাসজ নাজারেঙ্কো

183

সংক্ষিপ্ত বিবরণ

  1. আপনি কেবল মিনিটে রূপান্তর করতে চাইলে ব্রায়ান র্যামসে উত্তরটি আরও সুবিধাজনক।
  2. যদি আপনি চান কোকো এপিআই আপনার জন্য এটি করে এবং আপনার এনএসটিমে অন্তর্ভুক্তিকে কেবল কয়েক মিনিটের মধ্যেই নয়, দিনগুলি, মাস, সপ্তাহ, ইত্যাদি রূপান্তর করে ... আমার কাছে মনে হয় এটি আরও জেনেরিক পদ্ধতি
  3. এনএসক্যালেন্ডার পদ্ধতিটি ব্যবহার করুন:

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

    • "নির্দিষ্ট উপাদান ব্যবহার করে এনএসডিটকম্পোন্টস উপাদান হিসাবে, দুটি সরবরাহের তারিখের মধ্যে পার্থক্য হিসাবে প্রত্যাবর্তন হয়"। এপিআই ডকুমেন্টেশন থেকে।

  4. 2 টি এনএসডিট তৈরি করুন যার পার্থক্য হল আপনি রূপান্তর করতে চান এমন এনএসটাইম অন্তর্বর্তী। (যদি আপনার এনএসটাইমআইন্টারওয়ালটি 2 এনএসডেটের সাথে তুলনা করে আসে তবে আপনার এই পদক্ষেপটি করার দরকার নেই, এবং আপনার এমনকি এনএসটাইমআইন্টারওয়ালও লাগবে না)।

  5. এনএসডিটকম্পোন্টগুলি থেকে আপনার উদ্ধৃতিগুলি পান

কোডের উদাহরণ

// 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];

জ্ঞাত সমস্যা

  • মাত্র একটি রূপান্তরকরণের জন্য খুব বেশি, আপনি ঠিক বলেছেন, তবে এপিআই কাজ করে।
  • আমার পরামর্শ: আপনি যদি এনএসডিট এবং এনএসক্যালেন্ডার ব্যবহার করে আপনার সময় ডেটা পরিচালনা করতে ব্যবহার করেন তবে এপিআই আপনার জন্য কঠোর পরিশ্রম করবে।

4
সংক্ষিপ্তরূপে কেবল সামান্য রূপান্তরকরণের জন্য প্রচুর পরিমাণে কাজ করা হয় তবে এটি অলস, মডুলার এবং সত্যিই নমনীয় মনে হয়, @ আলবার্গের এই নমুনা কোডটির জন্য ভোট দিন।
রিগো ভাইডস

2
+1 একটি ভাল পুঙ্খানুপুঙ্খ উত্তরের জন্য, তবে এই কোডটি বেশ ব্যয়বহুল।
নিক ওয়েইভার

1
+1 ... একটি সতর্কতা আপনার যদি ভগ্নাংশের সেকেন্ডে গোল করতে হয় তবে এই স্টাইলের কোডটি ব্যবহারে সতর্ক হন। এর ডিফল্ট আচরণ - [এনএসক্যালেন্ডার উপাদান: তারিখ: টু ডেট: অপশনস:] যে পরিস্থিতিতে টুডেট উপাদানটি 31.30 সেকেন্ডের (উদাহরণস্বরূপ) ফরোয়ার্ডের চেয়ে এগিয়ে রয়েছে - সেখানে ফিরে আসা উপাদানগুলির সেকেন্ডের ক্ষেত্রে 31 থাকবে 31 এনএসআরপক্যালেন্ডার কম্পোনেন্টগুলির একটি alচ্ছিক প্যারামিটার রয়েছে, তবে এটির (সীমাবদ্ধ) পরীক্ষা থেকে আমি এটি করেছি, এটি গোলাকার বা নীচের চেয়ে নিকটতম দ্বিতীয়টিতে আবৃত। আপনার মাইলেজ পরিবর্তিত হতে পারে.
ডেভিড ডয়েল

%ldআপনি যদি 64 বিট মেশিনে থাকেন।
অনুপ বৈদ্য

5
যে ব্যক্তিরা এটি খুঁজে পেয়েছেন (নিক ওয়েভারের মতো) কোডটি মনে হচ্ছে এটি ধীর হবে। এটা না। আমি একটি টাইমার অ্যাপ্লিকেশন করছি এবং আমি ব্রায়ান র্যামসে (এবং অন্যদের) এর স্টাইলের কোনও কিছুর বিপরীতে আলবার্গারের সংস্করণটি পরীক্ষা করেছি ... এবং আশ্চর্যের বিষয়, এমনকি তুলনামূলকভাবে ধীর ডিভাইসে (4 এস) সেকেন্ডে 100 বার (যা প্রচন্ড ওভারকিল) ) প্রসেসরের ব্যবহারের ক্ষেত্রে 1% এরও কম পার্থক্য ছিল।
এমএমসি

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 6

আপনি আপনার কোডে একটি সেমিকোলন মিস করছেন তবে এটি ঠিক করার জন্য এটি আমাকে সম্পাদনা করতে দেয় না।
জিফ

আমি মনে করি আপনার পদ্ধতিটি সবচেয়ে ভাল - সহজ, কাজটি সম্পন্ন করে এবং টিক্সগুলিতে "হালকা"। পারফেক্ট।
বনানজাড্রাইভার

29

স্ট্যাক ভার্জিন হওয়ার জন্য আমাকে ক্ষমা করুন ... ব্রায়ান রামসেয়ের উত্তরের উত্তর কীভাবে দিতে হবে তা আমি নিশ্চিত নই ...

রাউন্ড ব্যবহার 59.5 এবং 59.99999 এর মধ্যে দ্বিতীয় মানগুলির জন্য কাজ করবে না। এই সময়ের মধ্যে দ্বিতীয় মান হবে 60। পরিবর্তে কাণ্ড ব্যবহার করুন ...

 double progress;

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

1
আসলে কেবল পুরো মেঝে এবং ট্রাঙ্ক / বৃত্তাকার সরান। :)
ইনভুলগোসফট

@ স্ট্রাটফ্যান আপনি কি আপনার উত্তরে কয়েক ঘন্টা যোগ করতে পারেন?
শ্মিড্ট

27

আপনি যদি আইওএস 8 বা ওএস এক্স 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এছাড়াও এই আউটপুট দীর্ঘ ফর্ম হতে অনুমতি দেয়। আরও তথ্য এনএসএইচইপস্টারের এনএসফর্মেটর নিবন্ধে পাওয়া যাবে । এবং আপনি ইতিমধ্যে কোন শ্রেণীর সাথে কাজ করছেন (যদি তা না হয় 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 elseNSDateComponentsFormatterএটি সব যত্ন নেয়। ঘন্টা, মিনিট, সেকেন্ড কোনও উদ্বেগ ছাড়াই মুদ্রিত।
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০.০ দিয়ে গুণ করুন।

ফলাফলটি হবে বাকি সেকেন্ডে।


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


লাইব্রেরিতে লিভারেজ

আপনি যদি সত্যিই স্বতন্ত্র উপাদান এবং আনন্দদায়ক পাঠযোগ্য কোড চান তবে সুইফটেট পরীক্ষা করে দেখুন :

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

5


পর্যাপ্ত ব্যবহারের জন্য @ মিকম্যাক্যালাম এবং @ পোলারওয়ার্ডে ক্রেডিট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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.