source

NSTime 변환 방법간격(초)(분)

lovecheck 2023. 6. 1. 22:50
반응형

NSTime 변환 방법간격(초)(분)

나는 많은 양을 가지고 있습니다.seconds어떤 사건으로부터 전해진 것.저장되어 있습니다.NSTimeInterval데이터 형식

로 변환하고 싶습니다.minutes그리고.seconds.

예를 들어, "326.4"초가 있고 "5:26"이라는 문자열로 변환하려고 합니다.

이 목표를 달성하는 가장 좋은 방법은 무엇입니까?

감사해요.

간단한 설명

  1. 분 단위로만 변환하려는 경우 Brian Ramsay의 답변이 더 편리합니다.
  2. 코코아 API를 원한다면 그렇게 하고 NSTime을 변환합니다.분뿐만 아니라 일, 월, 주 등의 간격...저는 이것이 더 일반적인 접근법이라고 생각합니다.
  3. NSC 캘린더 방법 사용:

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

    • "지정된 구성 요소를 사용하는 NSDateComponents 개체로 제공된 두 날짜 간의 차이를 반환합니다."API 설명서에서 확인할 수 있습니다.

  4. 차이가 NSTime인 2개의 NSDate 생성변환할 간격(NST 시간인 경우)간격은 이 단계를 수행할 필요가 없고 NST 시간도 필요하지 않은 2개의 NSDate를 비교하는 데서 발생합니다.간격).

  5. NSDateComponent에서 견적 받기

샘플 코드

// 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가 어려운 작업을 대신해 줄 것입니다.

유사 코드:

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

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

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에 플로트를 넣으면 자동으로 floor()가 나오지만, 기분이 좋아지면 처음 두 개에 추가할 수 있습니다 :-)

제가 스택 버진이 된 것을 용서해 주세요...브라이언 램지의 대답을 어떻게 대답해야 할지 모르겠습니다...

59.5와 59.9999 사이의 두 번째 값에는 반올림을 사용할 수 없습니다.이 기간 동안 두 번째 값은 60입니다.잘라내기 대신 사용...

 double progress;

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

iOS 8 또는 OS X 10.10 이상을 목표로 하는 경우 훨씬 쉬워졌습니다.더 뉴NSDateComponentsFormatter클래스를 통해 지정된 값을 변환할 수 있습니다.NSTimeInterval값(초)에서 사용자를 표시하는 현지화된 문자열로 이동합니다.예:

목표-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다음과 같은 방법으로도 수행할 수 있는 개체입니다.

목표-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의 코드, 비의사화:

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

Swift 버전은 다음과 같습니다.

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세기의 모든 것들은...

직접 수학을 하지 마십시오(스위프트 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


적절한 사용을 위한 @mickmaccalum 및 @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"

언급URL : https://stackoverflow.com/questions/1189252/how-to-convert-an-nstimeinterval-seconds-into-minutes

반응형