문제

나는 양의 seconds 는 전달에서는 특정 이벤트입니다.그것은에 저장됩 NSTimeInterval 데이터를 입력합니다.

고 싶으로 변환 minutesseconds.

예를 들어 내가:"326.4"초과로 변환하고 싶으로 다음 문자열:"5:26".

무엇이 최선의 방법입니다 이 목표를 달성하기 위해?

감사합니다.

도움이 되었습니까?

해결책

의사 코드 :

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

다른 팁

간단한 설명

  1. Brian Ramsay의 답변은 몇 분으로 만 변환하려면 더 편리합니다.
  2. Cocoa API가 당신을 위해 그것을하고 nstimeinterval을 몇 분뿐만 아니라 며칠, 몇 달, 주 등으로 변환하기를 원한다면 ... 나는 이것이 더 일반적인 접근법이라고 생각합니다.
  3. nscalendar 방법 사용 :

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

    • "지정된 구성 요소를 사용하여 NSDATECOMPONENTS 객체로서 두 개의 제공된 날짜의 차이로 반환됩니다." API 문서에서.

  4. 변환하려는 NSTIMEINTERVAL의 차이가있는 2 NSDATE를 만듭니다. (NSTIMEINTERVAL이 2 NSDATE를 비교 한 경우이 단계를 수행 할 필요가 없으며 NSTIMEINTERVAL이 필요하지 않습니다).

  5. NSDATECOMPONENTS에서 인용문을 받으십시오

샘플 코드

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

알려진 문제

  • 변환 만하기에 너무 많으면 옳지 만 API가 작동하는 방식입니다.
  • 내 제안 : NSDATE 및 NSCALENDAR을 사용하여 시간 데이터를 관리하는 데 익숙해지면 API가 열심히 일할 것입니다.

이 모든 것은 필요한 것보다 더 복잡해 보입니다! 다음은 시간 간격을 몇 시간, 분 및 초로 변환하는 짧고 달콤한 방법입니다.

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;

int에 플로트를 넣으면 플로어 ()가 자동으로 얻을 수 있지만 기분이 좋아지면 처음 두 개에 추가 할 수 있습니다 :-)

스택 처녀가 된 것에 대해 용서해주세요 ... Brian Ramsay의 답변에 어떻게 대답하는지 잘 모르겠습니다 ...

라운드 사용은 59.5와 59.99999 사이의 두 번째 값에 대해서는 작동하지 않습니다. 두 번째 값은이 기간 동안 60입니다. 대신 Trunc을 사용하십시오 ...

 double progress;

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

만약 당신이에 표적으로 또는 위 iOS8OS X10.10,이것은 훨씬 쉬워졌습니다.새로운 NSDateComponentsFormatter 클래스를 변환 할 수 있습어 NSTimeInterval 서에서 해당 값을 초 동안 지역화된 문자열을 보여 사용합니다.예를 들어:

Objective-C

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 체,수행 할 수있는을 통해뿐만 아니라 다음과 같은 방법이 있습니다.

Objective-C

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#>) {
    // ...
}

Brian Ramsay의 코드, de-pseudofied :

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

다음은 신속한 버전입니다.

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")
    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

본질적으로 두 배이기 때문에 ...

60.0으로 나누고 적분 부분과 분수 부분을 추출하십시오.

적분 부분은 정수 수입니다.

분수 부품에 다시 60.0을 곱하십시오.

결과는 나머지 초입니다.

원래 질문은 의사 코드 또는 개별 문자열 구성 요소가 아닌 문자열 출력에 관한 것입니다.

다음 문자열로 변환하고 싶습니다 : "5:26"

많은 답변이 국제화 문제를 놓치고 있으며 대부분 수학 계산을 손으로 수행하고 있습니다. 모두 20 세기 ...

스스로 수학을하지 마십시오 (Swift 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


크레딧 @mickmaccallum 그리고 @polarwar 적절한 사용을 위해 DateComponentsFormatter

Swift 에서이 작업을 수행 한 방법 (문자열 서식 포함 "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)

스위프트 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"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top