19

これらの形式のいずれかの日付を解析するために NSDateFormatter を使用しようとしています

@"2013-02-01T14:21:00"

また

@"2013-02-01T14:21:56.345"

現在、以下のメソッドを使用して文字列を解析し、日付を返しています。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];

[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
NSDate *date = [dateFormatter dateFromString:dateToFormat];

これは日付の最初のスタイルでは問題なく機能しますが、ミリ秒の部分を含む文字列に対しては nil を返します。

ミリ秒の存在をテストしてそれらを取り除くことができると思いますが、日付形式を変更して.SSSをオプションとして扱うことができるかどうか疑問に思っていましたか?

ご協力いただきありがとうございます

4

3 に答える 3

22

私の知る限り、オプションのパラメーターを作成する方法はありません。

通常の解決策は、フォーマットごとに 1 つずつ、2 つのフォーマッターを使用することです。使用するフォーマッターを決定するには、次のいずれかを実行できます。

  1. 日付文字列の文字数をカウントします ( Parsing a RFC 822 date with NSDateFormatter で提案されているように)

  2. 両方のフォーマッタを試して、最初の非nil結果を取得してください。

日付形式は似ているため、1 つのフォーマッターのみを使用できます。日付文字列が短すぎる場合は.000、フォーマッターを使用する前に追加します。

于 2013-02-14T15:58:01.793 に答える
2

iOS 10 以降の正しいアプローチはISO8601DateFormatter、ISO 8601 日付文字列のすべてのバリエーションを処理するために特別に作成されたものを使用することです。以下の例を参照してください。

let date = Date()
var string: String

let formatter = ISO8601DateFormatter()
string = formatter.string(from: date)

let GMT = TimeZone(abbreviation: "GMT")
let options: ISO8601DateFormatOptions = [.withInternetDateTime, .withDashSeparatorInDate, .withColonSeparatorInTime, .withTimeZone]
string = ISO8601DateFormatter.string(from: date, timeZone: GMT, formatOptions: options)

そしてObjective-Cバージョン:

NSDate *date = [NSDate date];
NSString *string;

NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
string = [formatter stringFromDate:date];

NSTimeZone *GMT = [NSTimeZone timeZoneWithAbbreviation: @"GMT"];
NSISO8601DateFormatOptions options = NSISO8601DateFormatWithInternetDateTime | NSISO8601DateFormatWithDashSeparatorInDate | NSISO8601DateFormatWithColonSeparatorInTime | NSISO8601DateFormatWithTimeZone;
string = [NSISO8601DateFormatter stringFromDate:date timeZone:GMT formatOptions:options];
于 2017-01-16T09:05:08.320 に答える