2013-09-06 33 views
9

Tôi có một vấn đề xa lạ với những dòng mã:lợi nhuận ngày formatter Nil cho tháng sáu

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMyyyy"]; 
NSDate * date = [df dateFromString:@"062008"]; 
NSLog(@"Date %@", date); 

Kết quả là:

Date (null) 

Nhưng khi tôi thay đổi tháng như thế này:

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMyyyy"]; 
NSDate * date = [df dateFromString:@"072008"]; 
NSLog(@"Date %@", date); 

Kết quả là:

Date 2008-06-30 23:00:00 +0000 

Chỉ trong tháng 6 (06), ngày chuyển đổi từ chuỗi không thành công!

Tôi nghĩ, đó là điều liên quan đến múi giờ, mọi ý tưởng.

Cảm ơn

giải quyết:

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 

Như tôi nghĩ, nó liên quan đến múi giờ.

+3

Viết câu trả lời của riêng bạn và nhấp vào câu trả lời của bạn - câu trả lời sẽ giúp bạn nhận điểm và làm rõ hơn cho những người khác theo dõi. –

+0

Và trong câu trả lời của bạn, bạn có thể giải thích chi tiết hơn: Làm thế nào nó liên quan đến múi giờ? OK, thay đổi múi giờ thành GMT "cố định" nó, nhưng đã làm * thực sự * sửa nó? Có vấn đề gì thế? Nếu đó thực sự là một sửa chữa và không chỉ là một băng, thì nó giải quyết vấn đề như thế nào? –

+0

Nhân tiện: Múi giờ nào là * bạn *? Khi tôi chạy mã đó, và dường như khi Hussain Shabbir (từ các câu trả lời) chạy nó, cả hai chúng ta đều có một ngày cho '@" 062008 "'. Bạn không, vì vậy, múi giờ và lịch là trình định dạng của bạn bằng cách sử dụng? Nếu bạn để mặc định ở chế độ mặc định, hệ thống của bạn sẽ đặt múi giờ và lịch nào? –

Trả lời

1

giải quyết: Như tôi nghĩ, nó liên quan đến múi giờ.

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
1

có! Bạn hoàn toàn chính xác. Tôi cũng phải đối mặt với cùng một vấn đề như suy nghĩ của tôi cũng vậy, nó liên quan đến timezone.Not chắc chắn cho dù đây là giải pháp lý tưởng cho các câu hỏi của bạn

NSString *[email protected]"06-2008"; 
NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MM-yyyy"]; 
[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
NSDate * date = [df dateFromString:strDate]; 
NSLog(@"Date %@", date); 
+0

Thay đổi định dạng ngày được viết không phải lúc nào cũng là tùy chọn và không tiết lộ bất cứ điều gì gây ra NSDateFormatter trả về 'nil' cho ngày đó ở định dạng đó. –

11

Xin chúc mừng, bạn đã tìm thấy hơn oddities múi giờ! Bạn đúng là việc thay đổi múi giờ của bạn sẽ khắc phục được sự cố. Chúng ta hãy chơi gameunking và xem liệu chúng ta có thể tìm ra lý do tại sao!

Đầu tiên, chúng tôi sẽ cố gắng và tìm mọi múi giờ nơi weirdness điều này xảy ra:

NSArray *tzs = [NSTimeZone knownTimeZoneNames]; 
NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
f.dateFormat = @"MMyyyy"; 
for (NSString *name in tzs) { 
    f.timeZone = [NSTimeZone timeZoneWithName:name]; 
    NSDate *date = [f dateFromString:@"062008"]; 
    if (date == nil) { 
     NSLog(@"%@", name); 
    } 
} 

này sẽ lặp qua tất cả các múi giờ được biết đến và cố gắng phân tích cú pháp "062.008" trong múi giờ đó. Nếu chúng ta chạy này, chúng tôi thấy rằng nó có thể ghi:

Africa/Casablanca 
Asia/Karachi 

Vì vậy, tôi đoán rằng bạn sống ở một trong hai Casablanca hoặc Karachi (vì theo mặc định, NSDateFormatter của bạn được khởi tạo với múi giờ của bạn, đó là lý do tại sao bạn đang gặp vấn đề này, có thể là Casablanca, cho rằng bạn có vẻ là 1 giờ trước GMT).

Hãy xem liệu chúng ta có thể tìm ra những gì là lạ với những múi giờ:

$ zdump -v Africa/Casablanca 
... snip ... 
Africa/Casablanca Sun Jun 1 00:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 WEST isdst=1 
... snip ... 

$ zdump -v Asia/Karachi 
... snip ... 
Asia/Karachi Sat May 31 19:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 PKST isdst=1 
... snip ... 

đủ chắc, có vẻ như cả hai Casablanca và Karachi bỏ qua giờ nửa đêm ngày 01 tháng 6 năm 2008. Do đó, bạn thực chất cho nó một ngày không thể phân biệt, và nó trở về nil. Tóm lại.

Trong trường hợp này, câu trả lời đúng để thay đổi múi giờ của bạn (GMT có thể là lựa chọn tuyệt vời), vì cơ hội là chuỗi này bạn đang phân tích không đến từ đầu vào của người dùng (được định dạng lạ) và do đó cần được phân tích cú pháp theo múi giờ chuẩn. Và mặc dù tôi chắc chắn rằng Casablanca và Karachi là những nơi thực sự gọn gàng, múi giờ của họ không chính xác là những thứ phổ biến ...

TL; DR:

Giờ tiết kiệm ánh sáng ban ngày phải được bãi bỏ.

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