サーバーからのタイムスタンプは次のようになります。
2013-04-18T08:49:58.157+0000
私はコロンを削除しようとしました、私はこれらすべてを試しました:
ISO 8601タイムスタンプをNSDateに変換する:UTCタイムオフセットはどのように処理されますか?
NSDateFormatterがISO 8601形式の日付を解析できない理由
ここに私がいるところがあります:
+ (NSDate *)dateUsingStringFromAPI:(NSString *)dateString {
NSDateFormatter *dateFormatter;
dateFormatter = [[NSDateFormatter alloc] init];
//@"yyyy-MM-dd'T'HH:mm:ss'Z'" - doesn't work
//@"yyyy-MM-dd'T'HH:mm:ssZZZ" - doesn't work
//@"yyyy-MM-dd'T'HH:mm:sss" - doesn't work
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
// NSDateFormatter does not like ISO 8601 so strip the milliseconds and timezone
dateString = [dateString substringWithRange:NSMakeRange(0, [dateString length]-5)];
return [dateFormatter dateFromString:dateString];
}
私の最大の質問の1つは、私が持っている日付形式が本当にISO 8601かどうかです。私が人々から見たすべての例は、それぞれの形式が少し異なります。一部は...157-0000
、最後に何もない人もいます。
これは私にとってはうまくいきます:
NSString *dateString = @"2013-04-18T08:49:58.157+0000";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
// Always use this locale when parsing fixed format date strings
NSLocale *posix = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[formatter setLocale:posix];
NSDate *date = [formatter dateFromString:dateString];
NSLog(@"date = %@", date);
Appleからの新しいAPIがあります! NSISO8601DateFormatter
NSString *dateSTR = @"2005-06-27T21:00:00Z";
NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
NSDate *date = [formatter dateFromString:dateSTR];
NSLog(@"%@", date);
私はネイティブAPIも持っています。これはよりクリーンです...これは私がDateTimeManagerクラスで取得した実装です。
+ (NSDate *)getDateFromISO8601:(NSString *)strDate{
NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
NSDate *date = [formatter dateFromString: strDate];
return date;
}
メソッドをコピーして貼り付けるだけでうまくいきます。楽しめ!
私にとってうまくいった完璧で最良の解決策は:
let isoFormatter = ISO8601DateFormatter();
isoFormatter.formatOptions = [ISO8601DateFormatter.Options.withColonSeparatorInTime,
ISO8601DateFormatter.Options.withFractionalSeconds,
ISO8601DateFormatter.Options.withFullDate,
ISO8601DateFormatter.Options.withFullTime,
ISO8601DateFormatter.Options.withTimeZone]
let date = isoFormatter.date(from: dateStr);
詳細については、Appleの公式ドキュメントを参照してください。 https://developer.Apple.com/documentation/foundation/nsiso8601dateformatter