web-dev-qa-db-ja.com

NSDateFormatter dateFromStringは常にnilを返します

繰り返し質問することを事前に謝罪したいと思いますが、他の解決策はまだ私のために働いていません。日付文字列をdateFromString関数に渡そうとするたびに、nilが返されます。私はiOS 7のアップデート以降に変更があったことをどこにも読んだことがありませんが、これがまだ同じように機能するかどうかに違いがある場合は、最新の状態です。

これは、文字列から日付を作成するために使用しているコードです。

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormat setLocale:[NSLocale systemLocale]];
    [dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
    [dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];

    NSDate *date = [[NSDate alloc] init];
    date = [dateFormat dateFromString:dateString];

    return date;

この問題を解決するために読んだすべてのソリューションに基づいてdateFormatを設定しましたが、これらの設定のいずれも問題によって解決していません。 systemLocaleは間違いなく英語用に設定されているため、問題は発生しません。

これは、dateFromStringに渡しているdateStringです。

Wednesday, October 9, 2013 at 2:40:29 PM Pacific Daylight Time

助けてくれてありがとう!

16
Macros185

ここには2つの問題があります。

  1. フォーマッターが期待する日付文字列の形式(@"yyyy-MM-dd hh:mm:ss")が、解析しようとしている日付文字列の形式(@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz")と異なります。

  2. フォーマッタのロケールを[NSLocale systemLocale]に設定すると、[dateFormat dateFromString:]nilを返します。 [NSLocate currentLocale]に設定します。

フォーマッタの完全なコードは次のとおりです。

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormat setLocale:[NSLocale currentLocale]];
    [dateFormat setDateFormat:@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz"];
    [dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];

    NSDate *date = [dateFormat dateFromString:dateString];
41
neilco

Nilを取得するさらに別の方法は、hhを使用し、24時間制で時間数が12を超える場合、HH(またはH、ゼロ詰めの場合)。

あれは:

  • 形式:yyyy-MM-DD hh:mm:ss、文字列:「2016-03-01 13:42:17」はnilを返します
  • 形式:yyyy-MM-DD HH:mm:ss、string: "2016-03-01 13:42:17"は、期待する日付を返します。

これについては@neilcoへのハットチップ(彼の回答の下のコメントを参照)。この回答が気に入ったら、彼も賛成投票してください。

25
Olie

NSDateFormatterドキュメント によると:

RFC 3339などの固定形式の日付を使用する場合は、dateFormatプロパティを設定して、形式文字列を指定します。

日付形式が2017-06-16T17:18:59.082083Zの場合、dateFormatプロパティは次のようになりますyyyy-MM-dd'T'HH:mm:ss.SSSSSSZ

Swift 3

let dateFormatter = DateFormatter()
let date = "2017-06-16T17:18:59.082083Z"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"

let result = dateFormatter.date(from: date) // 2017-06-16 17:18:59 +0000
3
Chris Tsitsaris

日付形式が渡した文字列と一致しません。dateStringは、[dateFormat setDateFormat:@ "yyyy-MM-dd hh:mm:ss"]のように、この形式でなければなりません。

2013-10-09 02:40:29

nilは、dateFormatオブジェクトが文字列を解析できなかったことを意味します。

2
ManicMonkOnMac

エスケープすることを忘れないでください"yyyy/MM/dd' 'HH:mm:ss"スペース記号

0

DateFromStringを使用しようとしていますが、フォーマッタに渡したフォーマットが、dateStringで使用しているものと異なります。

この構成をdateFormatで使用してみてください:E',' M d',' yyyy 'at' hh:mm:ss aa z

0
Davi Stuart