2012-01-15 27 views
15

Tôi phải khởi tạo đối tượng NSDate từ NSString trong mục tiêu-c. Tôi làm như sau:Tại sao múi giờ của tôi không được lưu vào NSDate?

NSString *dateString = [[webSentence child:@"DateTime"].text stringByReplacingOccurrencesOfString:@"T" withString:@" "]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-mm-dd HH:mm:ss"]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Budapest"]]; 

NSDate *date = [[NSDate alloc] init]; 
date = [dateFormatter dateFromString:dateString]; 

Ví dụ: khi tôi thử với giá trị chuỗi @ "2011-01-02 17:49:54" Tôi nhận được NSDate 2011-01-02 16:49:54 + 0000. Như bạn thấy có sự khác biệt một giờ giữa hai giá trị. NSDate có giá trị sai, nó phải chính xác giống như tôi đã định nghĩa trong chuỗi của tôi trong múi giờ mà tôi đã đặt trong dateFormatter. Dường như nó sử dụng ngày của tôi xác định nó chuỗi như UTC, ngay cả khi tôi đặt múi giờ của nó để "Châu Âu/Budapest". Làm cách nào để khắc phục sự cố này?

Cảm ơn!

Trả lời

14

Hai điều:

1) bạn gặp lỗi trong chuỗi định dạng ngày. Bạn nên sử dụng MM trong tháng, không mm (chữ thường mm là phút)

2) sau khi bạn tạo đối tượng bạn NSDate, bạn sẽ cần phải sử dụng các phương pháp NSDateFormatter stringFromDate: để tạo ra một chuỗi ngày cục bộ đến một múi giờ cụ thể. Nếu bạn chỉ làm một NSLog thẳng() trên đối tượng NSDate nó sẽ hiển thị ngày theo GMT theo mặc định (GMT là một giờ sau giờ Budapest)

+0

Cảm ơn rất nhiều! – Tom

+0

Vì vậy, điều đó có nghĩa là nếu tôi có một múi giờ, tôi không thể lưu trữ ngày vào đối tượng NSDate với múi giờ đó? Tôi sẽ phải lưu trữ múi giờ khác ở đâu và sử dụng nó trong khi hiển thị? – Nil

27

Ngày lưu trữ của NSDate tương ứng với ngày tham chiếu chuẩn. Từ tài liệu lớp học:

"Phương thức nguyên thủy duy nhất của NSDate, timeIntervalSinceReferenceDate, cung cấp cơ sở cho tất cả các phương thức khác trong giao diện NSDate. Phương thức này trả về giá trị thời gian tương ứng với ngày tham chiếu tuyệt đối — Tháng 1 năm 2001, GMT. "

NSDate không có bất kỳ khái niệm múi giờ nào. Vì vậy, NSDateFormatter đã làm điều đúng: nó chuyển đổi một ngày mà bạn đã nói nó có một bù đắp GMT (bằng cách xác định một múi giờ), và cho bạn một NSDate "bình thường hóa" cho ngày đó.

Nếu bạn muốn xem ngày được biểu thị theo múi giờ châu Âu/Budapest, hãy sử dụng định dạng ngày hiện tại của bạn (-stringFromDate :) hoặc phương pháp mô tả NSDate thích hợp (ví dụ: -descriptionWithCalendarFormat: timeZone: locale :).

P.S.- Bạn không cần phân bổ/init chút nào trong mã của mình như được viết. Trong không phải ARC sẽ bị rò rỉ.

P.P.S.- Định dạng ngày của bạn không đúng và đưa ra kết quả vô nghĩa. Tôi đã tiếp tục và làm sạch mã của bạn như sau (được thử nghiệm trong ARC):

NSString *dateString = @"2011-09-02 17:49:54"; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"Europe/Budapest"]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
[dateFormatter setTimeZone:tz]; 

NSDate *date = [dateFormatter dateFromString:dateString]; 
NSLog(@"%@", [dateFormatter stringFromDate:date]); 
NSLog(@"%@", [date descriptionWithCalendarFormat:nil timeZone:tz locale:nil]); 
+0

Vì vậy, NSdate không có khái niệm múi giờ. Nhưng nó có khái niệm GMT? Tôi không thể chuyển múi giờ thành giờ GMT và thêm múi giờ vào đối tượng NSDate? – Nil

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