2013-08-12 35 views
8

Trên máy của tôi (cài đặt khu vực Hoa Kỳ), định dạng ngày "ngắn" mặc định được đặt thành "1/5/13" (tháng/ngày/năm).Vấn đề NSDateFormatter liên quan đến số tuần

Trong Tùy chọn hệ thống, tôi đã nối thêm số đó vào một tuần, "1/5/13 1".

Vấn đề của tôi là mã này, nơi tôi cố gắng để chuyển đổi một chuỗi đến một ngày:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"]; 
NSLog(@"Date: %@", date); 

Trên máy tính của tôi, bản in này:

Date: 2000-01-01 05:00:00 +0000 

Đó là , mà không phải là thậm chí gần với .

Điều gì gây ra sự cố này?

+0

tại sao lật để thêm số này? sử dụng nsdateformatter để lấy nó. btw: bạn nên sử dụng '-dateFromString:'. Tôi nghĩ, bạn nên tham khảo tài liệu. http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html – vikingosegundo

+0

@vikingosegundo Tôi đã thay đổi mã để sử dụng 'dateFromString:', kết quả là như nhau.Điểm không phải là tôi đang thêm số tuần này :) Điểm là người dùng ** của tôi ** đã thêm số tuần này trong Tùy chọn hệ thống của họ và ứng dụng của tôi không biến nó thành ngày chính xác. –

+0

Tôi đã làm điều tương tự trong tùy chọn hệ thống, rồi thiết lập trình định dạng ngày kiểu ngắn, sau đó chạy 'NSString * dateString = [formatatter stringFromDate: [NDate date]]; NSDate * parsedDate = [formatter dateFromSTring: dateString]; 'và thấy cùng một vấn đề. 'dateString' được định dạng theo sở thích của tôi, nhưng trình định dạng sẽ không phân tích cú pháp chính xác chuỗi đó! Tôi đã thử các thay đổi khác đối với phong cách cũng như các kiểu khác và 'CFDateFormatter', với cùng một kết quả! Có lẽ đó là một lỗi khuôn khổ? –

Trả lời

8

Tôi trễ cuộc thảo luận này và đã thấy một số giải pháp được cung cấp, nhưng điều tôi thấy sai với tất cả là hai yếu tố định dạng ngày không tương thích đang được sử dụng cùng nhau. Cách tiếp cận ban đầu của bạn không thành công vì chuỗi mà bạn đang cố gắng lấy ngày của bạn không khớp với những gì mà NSDateFormatterShortStyle cung cấp.

Nếu bạn định đánh giá tuần trong năm, thì bạn phải sử dụng dạng viết hoa của năm; điều này cung cấp loại lịch "Tuần của năm".

Hãy tái hoạt động mã ban đầu của bạn một chút để bao gồm các định dạng mới:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/YY w"]; 
NSDate *date = [dateFormatter dateFromString:@"1/5/13 1"]; 
NSLog(@"Date: %@", date); 

Lưu ý rằng tôi đang sử dụng mà hình thức vốn trong năm. Với 1 trong tuần của năm, tôi có được điều này:

Date: 2013-01-05 08:00:00 +0000 

và với 2 trong tuần của năm:

Date: 2013-01-12 08:00:00 +0000 

và với 3:

Date: 2013-01-19 08:00:00 +0000 

Làm cho cảm giác phải không? Ngày trong ngày tăng thêm bảy ngày với mỗi lần gia tăng vào một trong các tuần trong năm. Dĩ nhiên, thời gian của chúng tôi đã được dorked, nhưng chúng tôi không bao giờ thảo luận bất cứ điều gì để đánh giá trong khu vực đó, phải không?

+1

+1 điều này là khá nhiều làm thế nào tôi muốn làm điều đó. Hãy đảm bảo rằng bạn chiếm các miền địa phương khác nhau bằng cách đặt thuộc tính 'locale' của trình định dạng thành ngôn ngữ được biểu thị bằng ngày trong chuỗi mà bạn đang phân tích cú pháp. Điều này sẽ hoàn toàn thất bại nếu (ví dụ) tôi đã ở Thái Lan, nơi mà năm 2013 là hơn 500 năm trước đây. Nói chung, việc đặt ngôn ngữ thành 'en_US_POSIX' hoạt động tốt cho chuỗi ngày tạo bởi máy tính. –

+0

"Cách tiếp cận ban đầu của bạn không thành công vì chuỗi mà bạn đang cố gắng lấy ngày của bạn không khớp với những gì NSDateFormatterShortStyle cung cấp." Bạn có thể giải thích xác nhận đó chi tiết hơn không? –

+0

@CarlVeazey ShortStyle có thể là bất kỳ số biến thể nào (bởi vì nó có thể được sửa đổi bởi người dùng trên OS X) và cũng sẽ không bao giờ bao gồm số tuần. –

-1

Bạn cần phải sử dụng phương pháp dateFromStringNSDateFormatter ...

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"mm/dd/yyyy"]; 
NSDate *myDate = [dateFormatter dateFromString:@"1/5/2013"]; 
NSLog(@"Date: %@", myDate); 

Nếu bạn muốn chơi với số tuần sau đó sử dụng NSCalendarNSDateComponents dựa trên nhu cầu của bạn ... (tham khảo đoạn mã này)

NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:date]; 
NSInteger week = [components week]; 

Tôi hy vọng điều này sẽ hữu ích.

2
NSDateComponents *cmp=[[[NSDateComponents alloc]init]autorelease]; 
[cmp setWeek:1]; 
NSCalendar *cal=[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSDate *dte=[NSDate date]; 
NSDate *weekDate=[cal dateByAddingComponents:cmp toDate:dte options:0]; 
[dateFormatter setDateFormat:@"MM/dd/YY"]; 
NSString *strDate=[dateFormatter stringFromDate:weekDate]; 
NSLog(@"Date: %@", strDate); 
Các vấn đề liên quan