2015-03-05 5 views
30

Моего кода здесь:преобразования NSTimeInterval в час, минуты, секунды, миллисекунды в быстрой

func stringFromTimeInterval(interval:NSTimeInterval) -> NSString { 

    var ti = NSInteger(interval) 
    var ms = ti * 1000 
    var seconds = ti % 60 
    var minutes = (ti/60) % 60 
    var hours = (ti/3600) 

     return NSString(format: "%0.2d:%0.2d:%0.2d",hours,minutes,seconds,ms) 
} 

на выходе миллисекунды дают неправильный result.Please дает представление о том, как правильно найти миллисекунды.

+0

Поскольку NSTimeInterval обычно не обрабатывать миллисекунды, но секунд, на мой вопрос, почему «* 1000», и она всегда должна быть 0. Если реализация управления миллисекунды, оно должно быть «% 1000» вместо этого, нет ? – Larme

+0

ya, вы правы, он должен% 1000. Я хочу точное время, поэтому я работаю с миллисекундами. – Lydia

+0

Конечно, NSTimeInterval обрабатывает доли секунды (например, миллисекунды). Это тип с плавающей точкой, а не целое число. –

ответ

73

Swift поддерживает вычисления остатков по номерам с плавающей запятой, поэтому мы можем использовать % 1.

var ms = Int((interval % 1) * 1000) 

как в:

func stringFromTimeInterval(interval: TimeInterval) -> NSString { 

    let ti = NSInteger(interval) 

    let ms = Int((interval % 1) * 1000) 

    let seconds = ti % 60 
    let minutes = (ti/60) % 60 
    let hours = (ti/3600) 

    return NSString(format: "%0.2d:%0.2d:%0.2d.%0.3d",hours,minutes,seconds,ms) 
} 

результат:

stringFromTimeInterval(12345.67)     "03:25:45.670" 
+0

Спасибо, что это сработало для меня – Lydia

+0

Может потребоваться добавить «% 24» в течение часов, т. Е. «Let hours = (ti/3600)% 24 –

15

Эквивалент в Objective-C, на основе @ Matthias-Bauch ответ.

+ (NSString *)stringFromTimeInterval:(NSTimeInterval)timeInterval 
{ 
    NSInteger interval = timeInterval; 
    NSInteger ms = (fmod(timeInterval, 1) * 1000); 
    long seconds = interval % 60; 
    long minutes = (interval/60) % 60; 
    long hours = (interval/3600); 

    return [NSString stringWithFormat:@"%0.2ld:%0.2ld:%0.2ld,%0.3ld", hours, minutes, seconds, (long)ms]; 
} 
2

для преобразования часа и минуты до нескольких секунд в быстром 2,0:

///RETORNA TOTAL DE SEGUNDOS DE HORA:MINUTOS 
func horasMinutosToSeconds (HoraMinutos:String) -> Int { 

    let formatar = NSDateFormatter() 
    let calendar = NSCalendar.currentCalendar() 
    formatar.locale = NSLocale.currentLocale() 
    formatar.dateFormat = "HH:mm" 

    let Inicio = formatar.dateFromString(HoraMinutos) 
    let comp = calendar.components([NSCalendarUnit.Hour, NSCalendarUnit.Minute], fromDate: Inicio!) 

    let hora = comp.hour 
    let minute = comp.minute 

    let hours = hora*3600 
    let minuts = minute*60 

    let totseconds = hours+minuts 

    return totseconds 
} 
+2

так усложнить для простой проблемы. – iLandes

0

преобразуется в быстрое расширение 2 + переменный формат:

extension NSTimeInterval { 

    func timeIntervalAsString(format format : String = "hh:mm:ss:sss") -> String { 
     let ms  = Int((self % 1) * 1000) 
     let asInt = NSInteger(self) 
     let s = asInt % 60 
     let m = (asInt/60) % 60 
     let h = (asInt/3600) 

     var value = format 
     value = value.replace("hh", replacement: String(format: "%0.2d", h)) 
     value = value.replace("mm", replacement: String(format: "%0.2d", m)) 
     value = value.replace("sss", replacement: String(format: "%0.3d", ms)) 
     value = value.replace("ss", replacement: String(format: "%0.2d", s)) 
     return value 
    } 

} 

extension String { 
    /** 
    Replaces all occurances from string with replacement 
    */ 
    public func replace(string:String, replacement:String) -> String { 
     return self.stringByReplacingOccurrencesOfString(string, withString: replacement, options: NSStringCompareOptions.LiteralSearch, range: nil) 
    } 

} 
2

быстры 3 вариант ответа @hixField, теперь с днями и обработкой предыдущих дат:

extension TimeInterval { 
    func timeIntervalAsString(_ format : String = "dd days, hh hours, mm minutes, ss seconds, sss ms") -> String { 
     var asInt = NSInteger(self) 
     let ago = (asInt < 0) 
     if (ago) { 
      asInt = -asInt 
     } 
     let ms = Int(self.truncatingRemainder(dividingBy: 1) * (ago ? -1000 : 1000)) 
     let s = asInt % 60 
     let m = (asInt/60) % 60 
     let h = ((asInt/3600))%24 
     let d = (asInt/86400) 

     var value = format 
     value = value.replacingOccurrences(of: "hh", with: String(format: "%0.2d", h)) 
     value = value.replacingOccurrences(of: "mm", with: String(format: "%0.2d", m)) 
     value = value.replacingOccurrences(of: "sss", with: String(format: "%0.3d", ms)) 
     value = value.replacingOccurrences(of: "ss", with: String(format: "%0.2d", s)) 
     value = value.replacingOccurrences(of: "dd", with: String(format: "%d", d)) 
     if (ago) { 
      value += " ago" 
     } 
     return value 
    } 

} 
9

СВИФТ 3 Расширение

Я думаю, что этот путь является легче увидеть, где каждая часть происходит от так что вы можете легко изменить его под свои нужды

extension TimeInterval { 
    private var milliseconds: Int { 
     return Int((truncatingRemainder(dividingBy: 1)) * 1000) 
    } 

    private var seconds: Int { 
     return Int(self) % 60 
    } 

    private var minutes: Int { 
     return (Int(self)/60) % 60 
    } 

    private var hours: Int { 
     return Int(self)/3600 
    } 

    var stringTime: String { 
     if hours != 0 { 
      return "\(hours)h \(minutes)m \(seconds)s" 
     } else if minutes != 0 { 
      return "\(minutes)m \(seconds)s" 
     } else if milliseconds != 0 { 
      return "\(seconds)s \(milliseconds)ms" 
     } else { 
      return "\(seconds)s" 
     } 
    } 
} 
+2

Джейк это может быть отличным ответом, но исчисление не на 100% правильное: | 3599 возвращает -1s | 12601 возвращает 3h -29m 1s – Kqtr

+3

Я предложил исправление, исправляющее исчисление. Еще раз спасибо за ваш ответ! – Kqtr

+0

@Kqtr где редактирование, которое фиксирует исчисление? –

6

Swift 3 решение для прошивкой 8+ MacOS 10.10+ если нулевой обивка из часов не имеет значения:

func stringFromTime(interval: TimeInterval) -> String { 
    let ms = Int(interval.truncatingRemainder(dividingBy: 1) * 1000) 
    let formatter = DateComponentsFormatter() 
    formatter.allowedUnits = [.hour, .minute, .second] 
    return formatter.string(from: interval)! + ".\(ms)" 
} 

print(stringFromTime(interval: 12345.67)) // "3:25:45.670" 
+0

use formatter.zeroFormattingBehavior = .pad, если вы хотите показать нуль – iLandes

+0

@iLandes '.pad' не добавляет начального нуля для наиболее значимого компонента (часов в ответе). – vadian

4

Swift 4, без использования .remainder (который возвращает неправильные значения):

func stringFromTimeInterval(interval: Double) -> NSString { 

    let hours = (Int(interval)/3600) 
    let minutes = Int(interval/60) - Int(hours * 60) 
    let seconds = Int(interval) - (Int(interval/60) * 60) 

    return NSString(format: "%0.2d:%0.2d:%0.2d",hours,minutes,seconds) 
} 
Смежные вопросы