2011-01-05 65 views
7

Tôi phải thiếu một cái gì đó nhỏ của mình nhưng không thể tìm ra nó. Đang cố gắng tạo ngày để so sánh, nhưng tôi dường như không thể bù đắp currentDate từ GMT sang EST:NSDate - Offsetting Múi giờ

// current date (gmt) // 
NSDate *currentDate = [NSDate date]; 

NSTimeZone *currentDateTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"EST"]; 

NSDateFormatter *currentDateFormat = [[NSDateFormatter alloc]init]; 
[currentDateFormat setTimeZone:currentDateTimeZone]; 
[currentDateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss zzz"]; 

NSString *currentDateString = [currentDateFormat stringFromDate:currentDate]; 
NSLog(@"currentDateString: %@", currentDateString); // returns 2011-01-05 13:30:30 EST 

NSDate *currentDateWithOffset = [currentDateFormat dateFromString:currentDateString]; 

NSLog(@"currentDateWithOffset: %@", currentDateWithOffset); // returns 2011-01-05 18:30:30 +0000 

Cảm ơn!

Edit:

Tôi gọi một phương thức trong một lớp học riêng biệt (cố gắng để làm portable này) bằng cách sử dụng dòng sau:

[Expiration expires:[[NSDate alloc] initWithString:@"2011-01-07 12:00:00 +0000"] within:1.0] 

trong phương pháp hết hạn, tôi có những dòng này:

NSComparisonResult comparison = [currentDateWithOffset compare:expires]; // check for a fixed date to disable the demo 

double withinRange = [installDate timeIntervalSinceDate:currentDateWithOffset]; // check for number of seconds between "within" and the install date 

tôi sau đó so sánh hai giá trị này như sau:

if(withinRange >= within && withinRange > 0.0) { 
    // app is expired // 
} 
else { 
    // app is still enabled (so far...) // 
    if(comparison == NSOrderedDescending || comparison == NSOrderedSame) { 
     // app is expired // 
    } 
    else { 
     // app is still enabled // 
    } 
} 

Điều này có hữu ích không? Cảm ơn sự kiên nhẫn của bạn!

Edit:

Dưới đây là toàn bộ hết hạn: trong phương pháp vì nó hiện đang đứng ...

+(BOOL)expire:(NSDate*)expires within:(double)within { 
    // default expired value // 
    BOOL expired = NO; 

    // convert within value from days to seconds // 
    within *= 24.0 * 60.0 * 60.0; 

    // current date (gmt) // 
    NSDate *currentDate = [NSDate date]; 

    // install date // 
    NSDate *installDate = [[NSUserDefaults standardUserDefaults]objectForKey:@"installDate"]; 

    // check for a value in installDate // 
    if (nil == installDate) { 
     // app is running for the first time // 
     [[NSUserDefaults standardUserDefaults]setObject:currentDate forKey:@"installDate"]; 
     [[NSUserDefaults standardUserDefaults]synchronize]; 
     installDate = currentDate; 
    } 

    if([installDate timeIntervalSinceNow] < (-within)) { 
     expired = YES; 
    } 
    else { 
     if([expires timeIntervalSinceNow] < 0) { 
      expired = YES; 
     } 
    } 

    NSLog(@"installDate:%@", installDate); 
    NSLog(@"expires:%@", expires); 
    NSLog(@"currentDate:%@", currentDate); 

    return expired; 
} 

tôi thì gọi đó là từ một lớp khác với

message.text = (YES == [Expiration expire:[[NSDate alloc] initWithString:@"2011-01-07 12:00:00 -0500"] within:(0.015625/2)]) ? @"This App is Expired" : @"This App is Active"; 

Khi chạy trong trình mô phỏng (cài đặt ứng dụng mới), NSLog hiển thị ...

[Session started at 2011-01-06 10:43:46 -0500.] 
2011-01-06 10:43:48.146 TimeBasedDemo[14717:207] installDate:2011-01-06 15:43:48 +0000 
2011-01-06 10:43:48.147 TimeBasedDemo[14717:207] expires:2011-01-07 17:00:00 +0000 
2011-01-06 10:43:48.147 TimeBasedDemo[14717:207] currentDate:2011-01-06 15:43:48 +0000 
+0

Bạn có thể cụ thể hơn về việc bạn thực sự muốn làm gì không? –

+0

Tôi đang cố gắng so sánh ngày/giờ hiện tại với ngày/giờ được cung cấp cho các ứng dụng demo giới hạn thời gian. Phần mà đó là cho tôi rắc rối là làm so sánh trong múi giờ của tôi (EST) thay vì GMT. Dễ sử dụng múi giờ của riêng tôi hơn chuyển đổi thành GMT khi tôi gọi phương thức chứa. – Eric

+0

Mã đó trông chính xác, và đầu ra cũng vậy. Tôi đoán vấn đề của bạn là bạn dự kiến ​​sẽ thấy '10:43:48 -0500' trong nhật ký thay vì '15:43:48 + 0000'. Vấn đề là - OK. Họ là * cùng một lúc *. Đó chỉ là cách nó in ra khi bạn gọi NSLog. –

Trả lời

5

Một đối tượng NSDate thể hiện ngay lập tức bất kể xem xét múi giờ và lịch. Thông tin múi giờ có liên quan khi bạn in hoặc phân tích ngày, nhưng không được lưu trữ trong vòng số NSDate.

Giả sử bạn đang tạo ra ngày hết hạn của bạn như thế này:

NSDate *exp=[[NSDate alloc] initWithString:@"2011-01-07 12:00:00 +0000"] 

nói rằng bạn muốn kết thúc thời hạn xảy ra vào buổi trưa giờ, trên 07 tháng 1 Nếu bạn muốn nó hết hạn vào buổi trưa EST, tạo ra nó thay vào đó là -0500. Những gì bạn nên không phải làm là lộn xộn với thời gian hiện tại khi bạn so sánh.

Một cách dễ dàng chỉ để xem nếu thời gian đã trôi qua là sau đó

if ([exp timeIntervalSinceNow]<0) { /* it's expired */ } 

và bạn có thể thấy nếu within giây đã trôi qua kể từ ngày cài đặt như thế này:

if ([installDate timeIntervalSinceNow]<(-within)]) { /* it's expired */} 
+0

Thêm vào bài đăng gốc để giữ mã sạch sẽ ... – Eric

+0

Tuyệt, tôi đã cập nhật câu trả lời của mình –

+0

Cảm ơn, bất biến! Điều đó giúp làm sạch (và rõ ràng) mọi thứ lên một chút, cảm ơn. Rất tiếc, tôi vẫn gặp sự cố với vấn đề múi giờ. installDate được thiết lập bằng cách sử dụng currentDate (NSDate * currentDate = [NSDate date];) do đó vẫn còn một sự khác biệt trong khi so sánh. Vì mục tiêu là sử dụng lại lớp mà không cần chỉnh sửa và để cho phép bù thời gian, có phải NSDate là cách thực sự đi với điều này không? – Eric

0

Trong Cocoa, NSDate là một đại diện trừu tượng của một ngày không áp dụng thông tin múi giờ. Lưu ý rằng currentDateWithOffset cùng ngày với chuỗi ngày, chỉ ở múi giờ khác (năm giờ trước). Đây là hành vi mong đợi, vì NSDate không tồn tại múi giờ được sử dụng để tạo ra nó.

0

Tôi dò tìm thêm một chút và tìm cách 'lừa' bù đắp cho phù hợp với nhu cầu của mình. Từ đọc khác, tôi đoán rằng NSCalendar có thể là một giải pháp hạn dài hơn, nhưng bây giờ tôi đã kết thúc thay đổi

NSDate *currentDateWithOffset = [currentDateFormat dateFromString:currentDateString]; 

để

NSDate *currentDateWithOffset = [[NSDate alloc] initWithString:[NSString stringWithFormat:@"%@ +0000", currentDateString]]; 

Đó đã cho tôi kết quả tôi cần thiết và các công trình trong những so sánh sau tôi đang sử dụng. Cảm ơn tất cả thông tin cơ bản!

+0

Bạn sẽ tốt hơn nếu đặt nỗ lực vào việc tạo ngày tham chiếu chính xác, sau đó bạn sẽ không phải vất vả ngày hiện tại để có được nó làm việc. –

+0

Tôi sẽ cố gắng tìm ra cách để làm điều đó. – Eric

17

Không có câu trả lời nào trong số này cho tôi đối tượng NSDate với ngày địa phương hiện tại. Vì vậy, đây là cách tôi đã làm điều đó:

NSDate *currentDateWithOffset = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone localTimeZone] secondsFromGMT]]; 
+0

Je vois ta tête partout! Cảm ơn câu trả lời! –

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