2013-05-23 41 views
8
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timestamp]; 
NSDateFormatter *_dateFormatter = [[NSDateFormatter alloc] init]; 
[_dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]]; 
[_dateFormatter setDateFormat:@"dd-MM-yy HH:mm"]; 
NSString *dateString = [_dateFormatter stringFromDate:date]; 
NSLog(@"Date: %@ formatted: %@", date, dateString); 
[_dateFormatter release]; 

Cung cấp cho tôi sai ngày định dạng:NSDateFormatter với múi giờ mặc định cho ngày khác với phương pháp mô tả NSDate

ngày: 2013/01/31 18:00:00 +0000 định dạng: 31-01-13 19:00 (từ dấu thời gian: 1359655200.000000)

Công cụ chuyển đổi trực tuyến: http://www.onlineconversion.com/unix_time.htm cho biết ngày đầu tiên là chính xác: 2013-01-31 18:00:00 +0000.

Tại sao NSDateFormatter tạo ngày khác mà NSLog? Không nên [NSDate description] sử dụng defaultTimeZone khi in sang bảng điều khiển? Tôi gặp lỗi tương tự với [_dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; và [_dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

Trả lời

17

Đây là hành vi đúng, bởi vì:

  1. [NSDate description] uses UTC, không phải là múi giờ địa phương (đó là lý do tại sao có một +0000 trong mô tả).
  2. NSDateFormatter của bạn đang sử dụng múi giờ địa phương.
  3. Bạn đang ở Đan Mạch, trong đó múi giờ địa phương là Giờ Trung Âu, hiện là UTC cộng một giờ.

Cách duy nhất chúng sẽ khớp với nhau là nếu bạn yêu cầu NSDateFormatter sử dụng UTC. Đó có thể không phải là những gì bạn muốn, mặc dù.

+3

[_dateFormatter setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @ "UTC"]]; giải quyết nó. – Lukasz

+3

Chỉ FTI, nói chung là tốt hơn để sử dụng 'timeZoneWithName:' ​​thay vì 'timeZoneWithAbbreviation:'. Đối với UTC nó không quan trọng, nhưng trong hầu hết trường hợp, tên là sự lựa chọn tốt hơn. –

+0

Lý do tại sao một số chữ viết tắt giống nhau, chẳng hạn như EST ở Úc và Hoa Kỳ. – migs647

-1

Đây là vấn đề múi giờ khi bạn phát hiện ra. Múi giờ mặc định sẽ mất múi giờ của hệ thống. Giả sử, nếu bạn đang trong GMT + 1, bạn có nghĩa vụ phải nhận được 19-00. Bộ chuyển đổi bạn đã sử dụng cung cấp cho bạn thời gian GMT.

Nếu bạn muốn múi giờ cụ thể thời gian và bạn biết được bù đắp từ giờ bạn có thể sử dụng sau đây,

[_dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:2*60*60]];//GMT+2.0 

Hy vọng điều này giải quyết vấn đề.

+0

Điều này không đúng. Tôi luôn luôn chắc chắn rằng nó là cách khác xung quanh nhưng tôi đã thử nó anyway và kết thúc với thậm chí tệ hơn: 31-00-13 19:01 – Lukasz

+0

BTW: nó không phải là tôi đã bình chọn bạn xuống. – Lukasz

+0

@Lukasz, Đó không phải là vấn đề. Đó là sai anyway. – Vignesh

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