2015-01-22 14 views
11

Tôi đang sử dụng NSDateComponentsFormatter trên iOS 8 và tôi đã nhận thấy có lỗi trong việc triển khai phương pháp stringFromTimeInterval:, nhưng tôi không thể nói chắc chắn.NSDateComponentsFormatter stringFromTimeInterval trả về chuỗi không chính xác trong khoảng thời gian ngắn hơn 1 phút

Đây là cách tôi đã thiết lập các định dạng:

NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init]; 
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDefault; 
formatter.allowedUnits = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; 
formatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional; 

Bây giờ khi tôi vượt qua bất cứ điều gì ít hơn 60 giây để phương pháp stringFromTimeInterval:, lợi nhuận định dạng hoặc 1 hoặc 01, mà rõ ràng là sai, nó nên trả lại một cái gì đó như 0:XX.

Điều tôi cũng nhận thấy là bằng cách thay đổi unitsStyle thành mọi thứ nhưng NSDateComponentsFormatterUnitsStylePositional phương thức trả về một chuỗi chính xác!

Ví dụ:

Với unitsStyle = NSDateComponentsFormatterUnitsStylePositional:

(lldb) po [formatter stringFromTimeInterval:12] 
= "1" 

=> có nên trở lại "00:12" !!

Với unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated:

(lldb) po [formatter stringFromTimeInterval:12] 
= "12 s" 

=> Đúng!

Điều này cho phép tôi nghĩ rằng đó là lỗi trong việc triển khai API của Apple, hoặc tôi có thiếu gì đó không?

+0

Kiểm tra câu trả lời/công việc bên dưới ... – MiKL

+0

Tôi biết nó không phải là giải pháp, nhưng bạn chỉ có thể đặt giá trị chuỗi nổi từ timeInterval nếu nó thấp hơn 60: nếu (self.timeInterval <60) { stringFromInterval = [NSString stringWithFormat: @ "% 2.0f", self.timeInterval]; } Bạn có cân nhắc hỏi trong Diễn đàn nhà phát triển Apple không? – xarly

Trả lời

1

NSDateComponentsFormatterZeroFormattingBehaviorDefault có nghĩa là giảm số 0 đứng đầu, các số không khác cho kiểu đơn vị Vị trí.

ví dụ: với các giá trị allowedUnits trong mã của bạn, kết quả [formatatter stringFromTimeInterval: 120] là "2:00" thay vì "0d 0:02:00", vì đối tượng định dạng đã loại bỏ tất cả các giá trị bằng không.

Nếu bạn muốn bảo lưu những nơi giá trị bằng không, bạn có thể sử dụng NSDateComponentsFormatterZeroFormattingBehaviorNone

Đối với lý do tại sao [formatter stringFromTimeInterval: 12] kết quả là 1, tôi nghĩ rằng đối tượng formatter thấy "12" thôi thì mơ hồ như nó không có dấu các giá trị hoặc chỉ báo cho ý nghĩa như trong "1d" chẳng hạn.

9

Điều này dường như vẫn là vấn đề với iOS 8.3 và Xcode 6.3. Có một cách để làm việc xung quanh nó tuy nhiên, trong đó, nếu không hoàn hảo, ít nhất là cho phép bạn để có được định dạng thích hợp mà không cần phải đối phó với thời gian tách các thành phần có liên quan chính mình.

Dưới đây là một cách giải quyết ví dụ trong Swift (mà bạn có thể kiểm tra trong một sân chơi)

let formatter = NSDateComponentsFormatter() 
formatter.unitsStyle = .Positional 
formatter.zeroFormattingBehavior = .Pad 
formatter.allowedUnits = .CalendarUnitMinute | .CalendarUnitSecond 

Calling let string = formatter.stringFromTimeInterval(4) sẽ in "00:04".

Gọi let string = formatter.stringFromTimeInterval(88) sẽ in "01:28".

Giờ đây, bạn có thể chơi với allowedUnits tùy thuộc vào việc bạn có nhiều hơn 1 giờ hoặc 1 ngày.Ví dụ trong một lớp học trong đó có một tài sản formatter:

func updateTimeFormatterForTime(time: NSTimeInterval) { 
    if time > 3600 && time < 24 * 3600 { 
     self.formatter.allowedUnits = .CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond 
    } else if time > 24 * 3600 { 
     self.formatter.allowedUnits = .CalendarUnitDay | .CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond 
    } 
} 
+0

.CalendarUnitMinute và .CalendarUnitHour, những thứ này không tồn tại nữa trong 9.1 Tôi không nghĩ hoặc có lẽ chúng chưa bao giờ làm hoặc tôi không biết tìm chúng ở đâu. Tôi không thể gán chúng cho allowedUnits vì lý do nào đó và chúng không phải là một phần của NSDateComponentsFormatter, ít nhất là không còn nữa. –

+0

'.CalendarUnitMinute' et al hiện là' .Minute' vv. Chúng chưa bị xóa. – squarefrog

0

Làm thế nào về chức năng này:

func stringFromTimeInterval(interval: NSTimeInterval) -> String { 
    let ti: Int = Int(interval) 
    let seconds: Int = ti % 60 
    let minutes: Int = (ti/60) % 60 
    let hours: Int = (ti/3600) 
    var time: String? = nil 
    if hours > 0 { 
     time = String(format: "%02i:%02i:%02i", hours, minutes, seconds) 
    } 
    else { 
     time = String(format: "%02i:%02i", minutes, seconds) 
    } 
    return time! 
} 

Returns thời gian trong này định dạng chuỗi: 59:04 (mm: ss) hoặc 09:01: 34 (hh: mm: ss)

Các vấn đề liên quan