2010-01-13 40 views
5

Tôi có một mảng là NSDates mà tôi tạo từ các chuỗi bằng cách sử dụng [NSDate dateFromString] Trong xml tôi đã phân tích cú pháp để nhận chuỗi đó cũng có một chuỗi múi giờ. Theo như tôi có thể thấy trong hướng dẫn sử dụng NSDate không trong nó tự đối phó với múi giờ. Tôi có cần phải luôn luôn lưu trữ giá trị múi giờ này ở đâu đó và ghép nó với thuộc số NSDate mỗi khi tôi cần nó không?So sánh trên NSDates ở các múi giờ khác nhau?

Tôi cũng cần phải tìm ra rằng nếu sự kiện bắt đầu ở Luân Đôn lúc 10:00, nhưng tôi ở Đan Mạch có iPhone của tôi được đặt thành thời gian Đan Mạch "sự kiện của tôi bắt đầu ở Luân Đôn" sẽ hiển thị lúc 09:00 giờ .

Một lần nữa nếu sự kiện bắt đầu ở Luân Đôn lúc 10:00 và kết thúc ở Đan Mạch lúc 12:00 giờ, Nếu tôi so sánh thời gian bắt đầu và thời gian kết thúc bằng iPhone với cài đặt danish, tôi sẽ hiểu thời gian diễn ra sự kiện là 02:00 sự kiện mặc dù 10:00 giờ ở Anh và 12:00 giờ ở Đan Mạch chỉ cách nhau 1 giờ.

NSdate hoạt động thực sự tốt cho những việc này trong phạm vi một múi giờ, nhưng việc giới thiệu phần múi giờ chỉ làm mọi thứ phức tạp với tôi. Có cách nào để tóm tắt/ẩn tất cả các tính toán này, vì tôi thấy tiềm năng gây ra nhiều sai lầm.

Tôi đã trải qua những NSDateformatter và NSDate dẫn từ Apple, nhưng họ thực sự mơ hồ và thể thao một số lượng đáng kể của mã bị phản đối:/

Nhờ sự giúp đỡ nhất định.

Trả lời

1

Bạn nên sử dụng một múi giờ chuẩn như định dạng UTC/GMT cho tất cả tính toán.

+0

Xin chào Brij, cảm ơn. Đó là cơ bản những gì tôi có bây giờ. Vấn đề nảy sinh vì ngày của tôi không có cùng múi giờ. Vì vậy, 10:00 không nhất thiết phải là 10:00 ở khắp mọi nơi. Tôi có 10:00 +0300, 10:00 −0400, v.v. và thực hiện so sánh giữa hai ngày có nghĩa là tôi cần phải có tham chiếu đến NSDates timezoneOffset đó với tôi luôn. Đó là khá dễ bị lỗi. – RickiG

+0

Hi Brij Tôi đã ở khắp mọi nơi và có vẻ như gợi ý của bạn là cách duy nhất xung quanh vấn đề này.Tôi để lại một phương pháp trong một câu trả lời dưới đây. – RickiG

+0

+1 Không chắc tại sao câu hỏi này được cập nhật một điểm? –

1

Theo số NSDate reference, dateWithString: lấy khoản bù đắp là GMT làm thành phần cuối cùng; trong khi nó không phải là một múi giờ, nó là đủ để thực hiện tính toán hoặc so sánh).

Nhìn vào NSTimeZone reference, bạn có thể sử dụng abbreviationForDate:timeZoneWithAbbreviation: để có được một đối tượng NSTimeZone từ một trường hợp NSDate. Khi bạn nhận được múi giờ, bạn có mọi thứ bạn cần.

+0

Đây là những gì tôi đã nói về các tài liệu NSDate là khủng khiếp, dateWithString không được chấp nhận kể từ OS 2.0, nhưng nó không nói trong tài liệu. Chúng ngụ ý bạn sử dụng định dạng ngày giống như sau: "YYYY-MM-DD HH: MM: SS ± HHMM", sai, phút phải thấp hơn. Có một dateFromString trên lớp NSDateformatter, nhưng điều này sẽ không chấp nhận phụ lục GMT như ± HHMM. Nó thực sự là một mớ hỗn độn:/ – RickiG

+0

Xin lỗi, tôi đã chỉ đến MacOS tham chiếu và không tham khảo iPhone. Có vẻ như rất khó để có được những gì bạn muốn vì tùy chọn duy nhất có vẻ là chuyển đổi độ lệch GMT thành NSTimeZone bằng "timeZoneForSecondsFromGMT:" hoặc để triển khai định dạng ngày tùy chỉnh. –

0

Ngay sau khi bạn đã cấp phát NSDate, những thông tin này không có thông tin múi giờ nữa. NSDate là "ít múi giờ" và luôn ở dạng GMT. Bạn nên chắc chắn rằng NSDate hiểu định dạng của bạn một cách chính xác khi phân bổ nó.

Khi bạn có NSDate, bạn có thể thực hiện các phép tính bình thường và bỏ qua múi giờ.

Bạn chỉ cần chăm sóc múi giờ khi đọc chuỗi vào NSDates và khi in chúng ra.

+0

Hi Felix, cảm ơn cho đầu vào. Tôi phân tích cú pháp ngày tháng thành chuỗi từ tệp xml. Vì vậy, khi thực hiện [NSDateformatter dateFromString], lựa chọn đã được lấy ra khỏi tôi. Một bản dựng NSDate như thế này luôn ở múi giờ địa phương. Trong giao diện của tôi, tôi hiển thị thời gian và ngày trong một trường và bù giờ GMT ở một trường khác. Vì vậy, ở đó tôi thực sự muốn họ trong các múi giờ riêng của họ. – RickiG

1

Tôi chuyển đổi ngày hiện tại và ngày tôi muốn biết nếu gần, đến GMT và sau đó trả lại sự khác biệt. Vì vậy, tôi đã thay đổi mọi thứ để đối phó với sự khác biệt thay vì thời gian và ngày thực tế. Một chút giống như điểm nhạc được chuyển sang một khóa khác :)

+ (NSInteger) minutesUntilDate:(NSDate*) date withTimezoneOffset:(NSInteger) GMTOffset  
{ 

NSDate *now = [NSDate date]; 
NSTimeInterval localTimeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; 

now = [now addTimeInterval:(localTimeZoneOffset * -1)]; 

date = [date addTimeInterval:(GMTOffset * 60 * 60) * −1]; 

return ((NSInteger)[now timeIntervalSinceDate:date]/60) * -1; 
} 
Các vấn đề liên quan