2011-11-01 30 views
15

Làm cách nào để chuyển đổi một số NSTimeInterval thành NSDate? Hãy nghĩ về nó như một đồng hồ bấm giờ. Tôi muốn ngày đầu tiên là 00:00:00 và tôi có số NSTimeInterval trong tổng số X giây.NSTimeInterval to NSDate

tôi cần phải làm điều đó như thế này bởi vì NSTimeInterval cần phải được chuyển đổi sang một int bằng cách sử dụng lround làm tròn lên, sau đó chuyển đổi sang một NSDate sử dụng NSDateFormatter để ném nó vào một chuỗi.

Trả lời

32

An NSTimeInterval, như tên của nó, um, ngụ ý, không đại diện giống như một số NSDate. An NSDate là thời điểm trong thời gian. Khoảng thời gian là khoảng thời gian. Để có được một điểm từ một khoảng thời gian, bạn phải có một điểm khác. Câu hỏi của bạn cũng giống như hỏi "Làm cách nào để chuyển đổi 12 inch thành một điểm trên bảng này mà tôi đang cắt?" Vâng, 12 inch, bắt đầu từ từ nơi?

Bạn cần chọn ngày tham chiếu. Điều này rất có thể là NSDate đại diện cho thời gian bạn bắt đầu bộ đếm. Sau đó, bạn có thể sử dụng +[NSDate dateWithTimeInterval:sinceDate:] hoặc -[NSDate dateByAddingTimeInterval:]

Điều đó nói rằng, tôi chắc chắn bạn đang nghĩ về điều này ngược. Bạn đang cố gắng hiển thị thời gian đã trôi qua kể từ một số điểm bắt đầu, tức là, khoảng thời gian , không phải thời gian hiện tại. Mỗi khi bạn cập nhật màn hình, bạn chỉ nên sử dụng khoảng thời gian mới. Ví dụ (giả sử bạn có một bộ đếm thời gian bắn theo định kỳ để làm bản cập nhật):

- (void) updateElapsedTimeDisplay: (NSTimer *)tim { 

    // You could also have stored the start time using 
    // CFAbsoluteTimeGetCurrent() 
    NSTimeInterval elapsedTime = [startDate timeIntervalSinceNow]; 

    // Divide the interval by 3600 and keep the quotient and remainder 
    div_t h = div(elapsedTime, 3600); 
    int hours = h.quot; 
    // Divide the remainder by 60; the quotient is minutes, the remainder 
    // is seconds. 
    div_t m = div(h.rem, 60); 
    int minutes = m.quot; 
    int seconds = m.rem; 

    // If you want to get the individual digits of the units, use div again 
    // with a divisor of 10. 

    NSLog(@"%d:%d:%d", hours, minutes, seconds); 
} 
6

Nếu bạn có ngày đầu tiên của bạn được lưu trữ trong một đối tượng NSDate, bạn có thể có được một ngày mới bất kỳ khoảng thời gian trong tương lai. Đơn giản chỉ cần sử dụng dateByAddingTimeInterval: như thế này:

NSDate * originalDate = [NSDate date]; 
NSTimeInterval interval = 1; 
NSDate * futureDate = [originalDate dateByAddingTimeInterval:interval]; 
12

tôi sẽ khuyên bạn không dùng NSDateFormatter nếu bạn muốn hiển thị khoảng thời gian. NSDateFormatter hữu ích khi bạn muốn hiển thị thời gian trong múi giờ địa phương hoặc múi giờ cụ thể. Nhưng trong trường hợp này, nó sẽ là một lỗi nếu thời gian được điều chỉnh múi giờ (ví dụ: một ngày mỗi năm có 23 giờ).

NSTimeInterval time = ...; 
NSString *string = [NSString stringWithFormat:@"%02li:%02li:%02li", 
               lround(floor(time/3600.)) % 100, 
               lround(floor(time/60.)) % 60, 
               lround(floor(time)) % 60]; 
+0

hoàn hảo! đúng thứ tôi cần! – hfossli

14

Một chuyển đổi dễ dàng từ và lưng được hiển thị ở đây:

NSDate * now = [NSDate date]; 
NSTimeInterval tiNow = [now timeIntervalSinceReferenceDate]; 
NSDate * newNow = [NSDate dateWithTimeIntervalSinceReferenceDate:tiNow]; 

Ole K Hornnes

2

Via apple developers:

// 1408709486 - Thời gian giá trị khoảng

NSDate *lastUpdate = [[NSDate alloc] initWithTimeIntervalSince1970:1408709486]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; 

NSLog(@"date time: %@", [dateFormatter stringFromDate:lastUpdate]); 

Bạn sẽ nhận được: ngày giờ: Aug 22, 2014, 3:11:26 PM

0

Khi Josh trả lời chi tiết đúng cách, nếu bạn vẫn muốn khoảng thời gian ở định dạng NSDate, bạn có thể sử dụng phương pháp sau

+ (NSDate *) dateForHour:(int) hour andMinute: (int) minute{ 
    NSDateComponents * components = [NSDateComponents new]; 
    components.hour = hour; 
    components.minute = minute; 
    NSDate * retDate = [[NSCalendar currentCalendar] dateFromComponents:components]; 
return retDate;} 
0

NSTimeInterval để NSDate chuyển đổi trong Swift:

let timeInterval = NSDate.timeIntervalSinceReferenceDate() // this is the time interval 
NSDate(timeIntervalSinceReferenceDate: timeInterval)