46

次のコードを使用する場合:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];   
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"];
NSLog(@"%@", [dateFormatter stringFromDate:myDate]);

オブジェクトに正常に変換されましたがDate、以外の方法でフォーマットできないようですyyyy-MM-dd'T'HH:mm。つまり、ログに記録されるのは2010-01-28T15:22:23

dateFormat を変更して[dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"];、Date オブジェクトが null であると言うと...

NSDateFormatterMediumStyleしたがって、私の最終的な質問は、たとえば、 「2010 年 1 月 1 日」を返すために使用するために、SQL データベースから ISO8601 タイムスタンプをフォーマットする方法です。

4

8 に答える 8

42

私は似ているが少し複雑な問題を抱えており、非常に簡単な解決策を見つけました!

問題: 受信する ISO8601 日付は次のようになります:2006-06-14T11:06:00+02:00末尾にタイムゾーン オフセットがあります。

解決策:ここからダウンロードできる Peter Hosey のISO8601DateFormatterを使用します。

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *theDate = [formatter dateFromString:dateString];
[formatter release], formatter = nil;

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;
于 2010-07-08T08:40:33.620 に答える
19

出力を処理するには、別のフォーマッターが必要です。あなたのコードの後に​​これを置いてください:

NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];   
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);
于 2010-02-04T17:46:03.297 に答える
19

これはアップルのサンプルコードです

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate *date = [formatter dateFromString:dateString];

リンク:<a href="https://developer.apple.com/library/ios/#qa/qa1480/_index.html" rel="noreferrer">https://developer.apple.com/library/ios/ #qa/qa1480/_index.html

于 2012-09-24T11:30:28.730 に答える
5

前回確認したとき、Apple のNSDateメソッドは ISO8601 をサポートしていませんでした。公式サポートを入れることについて、Apple にはまだバグがあります。

+ (id)dateWithNaturalLanguageString:(NSString *)string

適切に(最後に実行したときに)NSDateISO801文字列からオブジェクトを解析して作成しますが、ドキュメントには使用しないでくださいと書かれていますが、これまでに試したすべてのISO8601日付で機能しました。

于 2010-02-05T04:06:39.937 に答える
3

@danielbeardの答えはうまくいきました。ただし、タイムゾーンを含める必要があります。そうしないと、UTC 日付が現在のタイムゾーンに変換されますが、これは望ましくありません。

- (NSDate *) dateFromISO8601DateString:(NSString *) dateString {
    NSDateFormatter * dateFormatter = [NSDateFormatter new];
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate * date = [dateFormatter dateFromString:dateString];
    return date;
}
于 2014-07-08T16:15:57.847 に答える