2011-07-18 40 views
7

Tôi đang viết một ứng dụng giao tiếp với một số dịch vụ web. Khi một biến được cập nhật trên máy chủ, nó sẽ trả về một dấu thời gian unix để cho tôi biết khi nào nó được cập nhật. Sau đó tôi có thể so sánh nó bằng cách sử dụng:[[Ngày NSDate] timeIntervalSince1970] có vẻ là 1 giờ sau

[[NSDate date]timeIntervalSince1970] 

để giữ cho mọi thứ được đồng bộ hóa.

Thời gian hệ thống trên iPhone là chính xác. Nhưng thời gian unix dường như là 1 giờ phía sau máy chủ (và thời gian hệ thống như được hiển thị trên đồng hồ). Tại sao chuyện này đang xảy ra? Tôi có cần đặt múi giờ không?

Trả lời

12

timeIntervalSince1970 được xác định để trở lại:

Khoảng cách giữa máy thu và ngày tham khảo, 01 tháng 1 1970, giờ GMT.

Có thể bạn đang so sánh với thời gian được xác định là từ ngày 1 tháng 1 năm 1970 trong một múi giờ khác không? Nếu vậy, điều dễ nhất cần làm là sử dụng timeIntervalSinceDate: thay vì timeIntervalSince1970, có thể đã sử dụng số dateByAddingTimeInterval: của NSDate để chuyển từ ngày tham chiếu trong GMT sang ngày tham chiếu trong múi giờ lý tưởng của bạn.

Bạn có thể sử dụng thuộc tính secondsFromGMTForDate: của NSTimeZone nếu bạn không muốn sử dụng mã khó.

+1

Tôi nghĩ bạn đã hiểu. Vấn đề này dường như liên quan đến múi giờ. Tôi đã cố gắng đặt NSDateFormatter thành GMT và sau đó sử dụng timeIntervalSinceDate: trỏ đến ngày 1 tháng 1 năm 1970 và có vẻ như hoạt động đúng - Cảm ơn! – MikeT

1

Vì nó có thể được hiểu từ câu hỏi của bạn, vấn đề nằm trong dấu thời gian được máy chủ trả về. Vì vậy, câu hỏi thực sự là nếu bạn có quyền truy cập vào máy chủ đó. Hoặc bạn có biết trong khoảng thời gian đó không. Nếu trước tiên, hãy cập nhật thời gian trên máy chủ. Thứ hai - tính toán sự khác biệt giữa các múi giờ (bạn nói nó là một giờ) và thêm nó vào thể hiện NSDate của bạn. Bạn cũng có thể sử dụng NSCalendar vì nó có phương pháp -(void)setTimeZone:(NSTimeZone *)timezone;. (Nghĩ rằng nó có thể là chi phí cho nhu cầu của bạn)

+1

Tôi đã sử dụng setTimeZone trước nhưng phần bị thiếu có vẻ là timeIntervalSinceDate: thay vì timeIntervalSince1970 đã khắc phục sự cố. Cảm ơn vì đầu vào của bạn! – MikeT

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