2011-10-12 53 views

Trả lời

42

Hãy thử cách này:

Lưu ý: Thay đổi định dạng ngày theo nhu cầu của bạn.

NSDateFormatter* df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MM/dd/yyyy"]; 
NSDate* enteredDate = [df dateFromString:@"10/04/2011"]; 
NSDate * today = [NSDate date]; 
NSComparisonResult result = [today compare:enteredDate]; 
switch (result) 
{ 
    case NSOrderedAscending: 
     NSLog(@"Future Date"); 
        break; 
    case NSOrderedDescending: 
     NSLog(@"Earlier Date"); 
        break; 
    case NSOrderedSame: 
     NSLog(@"Today/Null Date Passed"); //Not sure why This is case when null/wrong date is passed 
        break; 
} 
+5

nên có sự ngắt sau mỗi câu lệnh để không nhập vào các trường hợp khác. –

+0

Lưu ý rằng điều này sẽ không bao giờ trở lại "ngày hôm nay" - NSDate đại diện cho một thời điểm cụ thể, do đó, 'NSOrderedSame' sẽ (về cơ bản) không bao giờ xảy ra – Tim

7

Xem Apple's documentation on date calculations:

NSDate *startDate = ...; 
NSDate *endDate = ...; 

NSCalendar *gregorian = [[NSCalendar alloc] 
       initWithCalendarIdentifier:NSGregorianCalendar]; 

NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit; 

NSDateComponents *components = [gregorian components:unitFlags 
              fromDate:startDate 
              toDate:endDate options:0]; 
NSInteger months = [components month]; 
NSInteger days = [components day]; 

Nếu days là giữa 1 và -1 sau đó ngày của bạn là một ứng cử viên cho "ngày hôm nay". Rõ ràng bạn sẽ cần phải suy nghĩ về cách bạn xử lý giờ. Có lẽ điều dễ nhất là đặt tất cả các ngày là 00: 00 giờ vào ngày được đề cập (truncate the date using an approach like this) và sau đó sử dụng các giá trị đó cho phép tính. Bằng cách đó bạn sẽ nhận được 0 cho ngày hôm nay, -1 cho ngày hôm qua, +1 cho ngày mai, và bất kỳ giá trị nào khác cũng sẽ cho bạn biết những thứ xa trong tương lai hoặc quá khứ.

+0

Điều này sẽ hiệu quả, nhưng để tránh các lỗi xung quanh thay đổi thời gian tiết kiệm ánh sáng ban ngày, hãy đặt giờ đến trưa (12:00:00) an toàn hơn nhiều. – Suz

+0

Trớ trêu thay, tôi đề nghị ban đầu thiết lập giờ đến trưa, nhưng ví dụ cho cắt ngắn đã thiết lập để nửa đêm và tôi figured cũng có thể giữ cho nó phù hợp! Tuy nhiên, nếu cả hai ngày trong cùng múi giờ, thì điều này sẽ không có sự khác biệt, vì thay đổi tiết kiệm ánh sáng ban ngày diễn ra lúc 2 giờ sáng, thiết lập đồng hồ trở lại 1 giờ sáng, vì vậy trong tất cả các trường hợp, hai ngày từ cùng một múi giờ sẽ cắt ngắn trong cùng một ngày theo lịch , bất kể tiết kiệm ban ngày. –

+0

Nếu bạn thực sự muốn tính giờ thời gian của tài khoản, cách tiếp cận tốt nhất là chuyển đổi cả hai ngày thành cùng múi giờ trước khi thực hiện bất kỳ điều gì khác. –

1
-(NSString*)timeAgoFor:(NSString*)tipping_date 
{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
    NSDate *date = [dateFormatter dateFromString:tipping_date]; 
    NSString *key = @""; 
    NSTimeInterval ti = [date timeIntervalSinceDate:[NSDate date]]; 
    key = (ti > 0) ? @"Left" : @"Ago"; 

    ti = ABS(ti); 
    NSDate * today = [NSDate date]; 
    NSComparisonResult result = [today compare:date]; 

    if (result == NSOrderedSame) { 
     return[NSString stringWithFormat:@"Today"]; 
    } 
    else if (ti < 86400 * 2) { 
     return[NSString stringWithFormat:@"1 Day %@",key]; 
    }else if (ti < 86400 * 7) { 
     int diff = round(ti/60/60/24); 
     return[NSString stringWithFormat:@"%d Days %@", diff,key]; 
    }else { 
     int diff = round(ti/(86400 * 7)); 
     return[NSString stringWithFormat:@"%d Wks %@", diff,key]; 
    } 
} 
+0

Tôi đã sử dụng điều này nhưng bằng cách nào đó Hôm nay không bao giờ đến, vì vậy tôi phải sửa đổi nó để tôi so sánh chỉ cuộc hẹn. Phần còn lại hoạt động tốt. Cuối cùng đã có vấn đề nó đã được so sánh thời gian với nó. Tôi phải điều chỉnh cho phù hợp – ChArAnJiT

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