2012-01-16 29 views
4

YouTubeのAPIは、RFC3339形式の日付文字列を返します。私はマニュアルでそれを解析する方法を見つけましたが、とにかく、これは長すぎます。iOSでRFC3339の日付文字列を解析する最も簡単な方法は何ですか?

- (NSString *)userVisibleDateTimeStringForRFC3339DateTimeString:(NSString *)rfc3339DateTimeString 
    // Returns a user-visible date time string that corresponds to the 
    // specified RFC 3339 date time string. Note that this does not handle 
    // all possible RFC 3339 date time strings, just one of the most common 
    // styles. 
{ 
    NSString *   userVisibleDateTimeString; 
    NSDateFormatter * rfc3339DateFormatter; 
    NSLocale *   enUSPOSIXLocale; 
    NSDate *   date; 
    NSDateFormatter * userVisibleDateFormatter; 

    userVisibleDateTimeString = nil; 

    // Convert the RFC 3339 date time string to an NSDate. 

    rfc3339DateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 

    enUSPOSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 

    [rfc3339DateFormatter setLocale:enUSPOSIXLocale]; 
    [rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 
    [rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

    date = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString]; 
    if (date != nil) { 

     // Convert the NSDate to a user-visible date string. 

     userVisibleDateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
     assert(userVisibleDateFormatter != nil); 

     [userVisibleDateFormatter setDateStyle:NSDateFormatterShortStyle]; 
     [userVisibleDateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

     userVisibleDateTimeString = [userVisibleDateFormatter stringFromDate:date]; 
    } 
    return userVisibleDateTimeString; 
} 

私は機能がこれを含ませることができますが、私が知りたいのは、これを行うにはココアの基礎や、標準CまたはPOSIXライブラリであり、事前に定義された方法です。それがあればそれを使いたいです。もっと簡単な方法があるのか​​教えていただけますか?または、これが最も簡単な方法であることを確認したら、非常に感謝します:)

答えて

2

純粋なものは、ココアのようなものがあなたのやっていることです。おそらくinitに日付フォーマッタを作成し、このメソッドで/ reusingを使用することで、このメソッドを短くて高速にすることができます。

+0

残念ながら、このコードでは、一度だけテストした時の秒の派閥部分を処理できませんでした。 – Eonil

+0

@Eonil:フォーマット文字列を修正する必要があります。関連する仕様では、小数点以下の桁数に対してフォーマット文字が定義されています。http://unicode.org/reports/tr35/tr35-10.html#Date_Format_Patterns –

+0

ああこれはいいですね。私はこれを試してみる:) – Eonil

1

Obj-cのRFC 3339の解析に問題がありました。なぜなら、分数秒とゾーンはオプションであると思われるからです。

私が見つけた最も信頼性の高い機能は、(私は作者ないですいる)この骨子だった:https://gist.github.com/mwaterfall/953664

2

次の2つの形式を必要とする小数秒はオプションであり、そしてタイムゾーンはZ5、ないZ.する必要がありますので、だから、

@"yyyy'-'MM'-'dd'T'HH':'mm':'ssX5" 
@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSSSSX5" 

の2つのフォーマッタを作成し、それらの両方を試してみましょう。それは明らかにRFC3339です。あなたの文字列はその形式ではないかもしれません。うれしいことにRFC822を要求していないことをうれしく思います。しかし、実際には、NSDateを返すメソッドを最初に用意する必要があります。なぜなら、ほとんどの用途では、実際にユーザー用にフォーマットされた文字列は必要ないからです。

関連する問題