2009-10-07 40 views
6

Tôi đang có một thời gian khủng khiếp khi cố gắng làm điều gì đó dễ dàng. Tôi có giá trị NSNumber là 32025,89 giây. Tôi cần phải thể hiện điều đó trong giờ, phút, giây. Có phương pháp nào phun ra được không? Tôi dường như không thể tìm thấy một trình định dạng phù hợp.NSNumber giây để Giờ, phút, giây

+0

Bản sao của http://stackoverflow.com/questions/1237778/how-do-i-break-down-an-nstimeinterval-into-year-months-days-hours-minutes-and. –

Trả lời

8

Bạn đã thử tạo NSDate từ đó và in bằng cách sử dụng NSDateFormatter?

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[theNumber doubleValue]]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"HH:mm:ss"]; 
NSLog(@"%@", [formatter stringFromDate:date]); 
[formatter release]; 

Nếu bạn cần giá trị riêng cho giờ, phút và giây, hãy sử dụng NSDateComponents theo đề xuất của nall.

Ở trên sẽ không in số tiền chính xác nếu số NSNumber đại diện cho nhiều hơn một ngày. Nó có thể là 1 ngày và 1 giờ, và nó sẽ chỉ in 01:00:00. Trong trường hợp này, bạn nên tính giờ, phút và giây theo cách thủ công.

+0

Điều này là nhiều hơn dọc theo dòng của những gì tôi đang tìm kiếm. Tôi biết tôi có thể od toán học nhưng tôi đã cố gắng để tìm một cách mà về cơ bản đã làm nó cho tôi - NSDateFormatter là tôi đoán, những gì tôi cần. Cảm ơn. – SonnyBurnette

+0

Sử dụng mã này Tôi đã có một người dùng có giá trị không đúng - thay vì 03:00 trong 180 giây - họ nhận được 33:00. Họ đang ở trong một múi giờ trước 4,5 giờ và tôi tự hỏi liệu nửa giờ trong múi giờ của họ có thể gây ra điều này ... – petenelson

9

Nếu bạn không muốn chỉ phân chia, hãy thử điều này. Nó có thể đủ gần cho mục đích của bạn. Lưu ý: Nó không tính đến độ chính xác phụ thứ hai. (setSecond mất NSInteger).

NSDateComponents* c = [[[NSDateComponents alloc] init] autorelease]; 
[c setSecond:32025.89]; 

NSCalendar* cal = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] 
        autorelease]; 

NSDate* d = [cal dateFromComponents:c]; 

NSDateComponents* result = [cal components:NSHourCalendarUnit | 
              NSMinuteCalendarUnit | 
              NSSecondCalendarUnit 
            fromDate:d]; 

NSLog(@"%d hours, %d minutes, %d seconds", 
    [result hour], [result minute], [result second]); 
+0

Không hoạt động sau 24 giờ (giờ sẽ đến 0 vv) – Jonny

+0

những gì tôi mong đợi, làm việc tốt của nó. tuyệt quá. Tôi upvote ur câu trả lời – akk

4

Đây là một cách mà không cần bất kỳ thư viện trừ modf() từ math.h:

float fsec = 32025.89f, frac = 0; 
int milliseconds = (int)(modf(fsec, &frac) * 1000); 
int isec = (int)frac; 
int hours = isec/3600; 
int minutes = (isec % 3600)/60; 
int seconds = isec % 60; 
+0

Tôi chỉ nhận thấy rằng bạn chia 0 cho 3600 để nhận giờ. Đó là một lỗi đánh máy, phải không? Bạn có nghĩa là để nói "fsec/3600" phải không? – SonnyBurnette

+0

Và 'frexp' phải làm gì với điều này? –

+0

um ... nó trích xuất phần phân số và phần nguyên của số con trỏ floatingh. Trong trường hợp này, mili giây và giây. –

2

NSNumber * valueForDisplay = [NSNumber numberWithDouble: [tự valueForDisplay: clockName]];

NSNumber *totalDays = [NSNumber numberWithDouble: 
     ([valueForDisplay doubleValue]/86400)]; 
NSNumber *totalHours = [NSNumber numberWithDouble: 
     (([valueForDisplay doubleValue]/3600) - 
      ([totalDays intValue] * 24))]; 
NSNumber *totalMinutes = [NSNumber numberWithDouble: 
     (([valueForDisplay doubleValue]/60) - 
     ([totalDays intValue] * 24 * 60) - 
     ([totalHours intValue] * 60))]; 
NSNumber *totalSeconds = [NSNumber numberWithInt: 
     ([valueForDisplay intValue] % 60)]; 
Các vấn đề liên quan