web-dev-qa-db-ja.com

iPhone NSDateFormatterタイムゾーン変換

表示されている日付形式をNSDateオブジェクトに変換するフォーマッターを作成しようとしています。

NSString *dateStr = @"2010-06-21T19:00:00-05:00";
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
NSDate *date = [dateFormat dateFromString:dateStr];  

問題はタイムゾーン-05:00で、上記の形式では正しく解析されません。助言がありますか?

33
John Muchow

正直なところ、フォーマッタを実行する前に、ソースデータを変更する(コロンを削除する)必要があります。元の日付文字列は非標準であり、タイムゾーン形式文字列はどれも正しく機能しません。

有効な入力 nicode.org を確認できます。

ZZZ例「-0500」

ZZZZ例「GMT-05:00」

「-05:00」には何もない

30
chrissr

コロンを含むタイムゾーンを処理するには、5つの「Z」を使用するだけです。これはかなり一般的な日付形式であるISO-8601形式です。これはiOS 6.x以降でのみ機能します

-(NSDate *) dateFromString:(NSString *)string {

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];

    return [formatter dateFromString:string];
}
64
brynbodayle

私は何かを逃したかもしれませんが、ZZは私のために働きました。私が使用した:

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

for

2014-02-27T08:00:00.000+04:00
2
DanSkeel

これは、Sinatra ActiveRecordバックエンドから取得したデフォルトの時間形式です。これが私の解決策です。

-(NSDate *) dateFromString:(NSString *)string{
    NSMutableString * correctedDateString = [[NSMutableString alloc] initWithString:string];
    [correctedDateString deleteCharactersInRange: NSMakeRange(22, 1)];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];

    return [formatter dateFromString:correctedDateString];
}
1
Logan

これは私のために働いた唯一の解決策です:

[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
1
Dave Cole

5 ZZZZZ-GMTからBSTへのサンプルで書いたカテゴリがここにあります

https://github.com/clearbrian/NSDateFormatter_ISO_8601

0
brian.clear