2010-06-07 45 views
13
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 
    [dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzz"]; 
    NSString *dateString = @"Tue, 08 Jun 2010 17:00:00 EDT"; 
    NSDate *eventDate = [dateFormatter dateFromString:dateString]; 

Trong trường hợp này đối tượng eventDate là không. Ai đó có thể dẫn tôi vào? Mã này được sử dụng để hoạt động.Có gì sai với cách tôi đang sử dụng NSDateFormatter?

CẬP NHẬT: Không thể nói về lý do tại sao điều này không hoạt động do NDA. Đủ để nói, khi iOS 4 ra tôi sẽ đăng câu trả lời cho câu hỏi của riêng tôi.

+0

Bạn đang sử dụng "NSString dateString" và "NSDate eventDate" hoặc bạn có nghĩa là "NSString * dateString" và "NSDate * eventDate"? – Dre

+0

Tốt bắt ... Đây không phải là mã thực tế sao chép đúng nguyên văn. Tôi không muốn đưa ra quá nhiều ngữ cảnh trên ứng dụng. –

+0

tôi nghĩ bạn nên viết dd thay vì d trong setDateFormat, hãy thử nó. – harshalb

Trả lời

4

Câu trả lời cho câu hỏi này là như sau: Tôi đã sử dụng chuỗi định dạng ngày sai:

@"EEE, d MMM yyyy HH:mm:ss zzz" 

khi nó cần phải có được:

@"EEE, dd MMM y HH:mm:ss zzz" 

Phần về iOS 4 và NDA là tôi nghĩ mình phải sử dụng phương thức NSDateFormatterdateFormatFromTemplate:options:locale: trông giống như sau:

NSString *format = [NSDateFormatter dateFormatFromTemplate:@"EEE, d MMM yyyy HH:mm:ss zzz" options:0 locale:[NSLocale currentLocale]]; 

Tuy nhiên, phương pháp này chỉ nên được sử dụng khi bạn muốn hiển thị ngày cho người dùng miền địa phương không xác định. Trong trường hợp của tôi, tôi biết chính xác định dạng ngày sẽ trông như thế nào và tôi đã cố gắng PARSE chuỗi ngày để tôi có thể lưu trữ nó trong CoreData. Do đó, phương pháp đó không hữu ích.

Bonus bookmark: đọc bảng này rất cẩn thận và bạn chắc chắn sẽ tìm ra vấn đề là gì ... định dạng ngày Unicode nên làm theo các thông số kỹ thuật: http://unicode.org/reports/tr35/tr35-6.html#Date_Field_Symbol_Table

TL; DR Chuỗi định dạng đã sai . D'oh!

64
/* 
    x   number 
    xx   two digit number 
    xxx   abbreviated name 
    xxxx  full name 

    a   AM/PM 
    A   millisecond of day 
    c   day of week (c,cc,ccc,cccc) 
    d   day of month 
    e   day of week (e,EEE,EEEE) 
    F   week of month 
    g   julian day (since 1/1/4713 BC) 
    G   era designator (G=GGG,GGGG) 
    h   hour (1-12, zero padded) 
    H   hour (0-23, zero padded) 
    L   month of year (L,LL,LLL,LLLL) 
    m   minute of hour (0-59, zero padded) 
    M   month of year (M,MM,MMM,MMMM) 
    Q   quarter of year (Q,QQ,QQQ,QQQQ) 
    s   seconds of minute (0-59, zero padded) 
    S   fraction of second 
    u   zero padded year 
    v   general timezone (v=vvv,vvvv) 
    w   week of year (0-53, zero padded) 
    y   year (y,yy,yyyy) 
    z   specific timezone (z=zzz,zzzz) 
    Z   timezone offset +0000 

    sql   y-M-d H:m:s 
    rss   [E, ]d MMM y[y] H:m:s Z|z[zzz] 
*/ 

Đây là nhận xét của tôi về phân tích cú pháp ngày. Tôi sử dụng những điều sau đây, trong đó toDateUsingFormat sử dụng một NSDateFormatter với chuỗi được truyền vào. Tôi không sử dụng một miền địa phương, bởi vì ngày tháng rss không được bản địa hoá.

if (0 == [string rangeOfString:@","].length) { 
     result = [string toDateUsingFormat:@"d MMM y H:m:s z"]; 
    } else { 
     result = [string toDateUsingFormat:@"E, d MMM y H:m:s z"]; 
    } 

Edit:

tôi sử dụng getObjectValue: thay vì dateFromString.

NSDate *result = nil; 
NSError *error = nil; 
[dataFormatter getObjectValue:&result forString:dateString errorDescription:&error]; 
+0

Sử dụng một E không hoạt động. Tôi sẽ thử một trong những bạn có cho RSS kể từ khi nó đến từ một nguồn cấp dữ liệu RSS. –

+0

Vâng, điều đó không có tác dụng ... Tôi nghĩ nó có thể bị hỏng trong bản iOS 4 Beta. Lý do điều này rất bực bội là nó được sử dụng để làm việc tốt! Được bảo vệ bởi NDA mặc dù vậy tôi đoán đó là tất cả cho bây giờ. –

+0

Tôi nhận được thông báo lỗi sau: "Không thể hoàn tất thao tác. (Lỗi ca cao 2048.)" –

3

Danh sách đầy đủ các định danh định dạng là UTS#35 Date Format Patterns.

Nhân vật 'c' có hoạt động thay cho 'E' không? Các tài liệu có nó như là một thay thế rất gần và nó có thể tạo ra kết quả mà bạn muốn.

(Nếu bạn thực sự muốn ký tự trong chuỗi định dạng mà không có trong bảng, bạn có thể thoát khỏi chúng, như hh 'o''clock' a, zzzz -. Tạo ra định dạng như "12:00, Thái Bình Dương Ánh sáng ban ngày Thời gian")

0

Vấn đề mà tôi tìm thấy là chuỗi mà tôi đang phân tích cú pháp có một số ký tự đuôi "\ n \ t \ t". Giải pháp là để loại bỏ chúng:

[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

+0

Rất tiếc, đây không phải là vấn đề trong mã cho câu hỏi. Như bạn có thể thấy ở đó, ngày được mã hóa cứng vì mục đích của ví dụ. Giải pháp của bạn có thể giúp một số người mặc dù! –

0

bạn có một ngày không có đệm, cụ thể là 08 trong chuỗi ngày của bạn, tuy nhiên trong chuỗi định dạng của bạn, định dạng đang cố gắng phân tích ngày đệm khác.thay đổi d thành dd nên khắc phục sự cố

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