2015-09-19 3 views
8

iOS9にアップグレードしたばかりのデバイス(アプリケーションのターゲットは8.1)で実行した後、自分のアプリケーションの1つに問題が発生しています。NSDateFormatter.dateFromStringがiOS9のアップグレード後にnullを返す

アプリがiOS9より前で正常に動作していますが、デバイス上でiOS9にアップグレードした後、次の問題が発生しています。

「anObsDate」と呼ばれる以下の変数がnullを返すようになりました。なぜ私は考えていない。ホストデバイス上のiOS9のスタンドアロンアップグレードにより、この問題が発生するようになったようです。私は次のデバッグとアプリケーションを実行すると

NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]]; 

、我々はこの出力を持っている:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_AU"]; 
NSDateFormatter *countDownFormatter = [[NSDateFormatter alloc] init]; 
[countDownFormatter setLocale:locale]; 
[countDownFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Australia/Melbourne"]]; 
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss"]; 
return countDownFormatter; 

は再びこれを明確にするために、次のように私は私の日付フォーマッタを設定

 NSLog(@"Timestamp %@", [anObs timeStamp]); 
    NSLog(@"Formatter %@", [self bomDateFormatter]); 
    NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]]; 

Timestamp 2015-09-17 00:01:10 
Formatter <NSDateFormatter: 0x7fe7abc653c0> 

iOS9以前のデバイスでアプリケーションを実行すると、すべて正常に動作し、dateFromStringはNSDateを返します。 iOS9にアップグレードした後、dateFromStringはnullを返します。

提案がありますか?

ありがとうございました。

答えて

6

NSDateFormatterは、日付形式の一重引用符で囲まれた文字が文字列の文字と正確に一致するように、iOS 9の動作が変更されているようです。これまでは、任意の文字を受け入れることになりました(ドキュメントを検索しましたが、この変更の言及は見つかりませんでした)。

タイムスタンプ文字列には、日付形式で定義された "T"がありません。あなたの日付形式を変更してみてください:

// Note the "T" has been removed 
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss"]; 

あなたの他のオプションは、タイムスタンプ文字列の中に「T」を追加することです:

// Note the "T" has been added 
2015-09-17T00:01:10 

これはiOSの以前のバージョンとの下位互換性がなければなりません。

+0

上のスポット。私は私の日付形式から 'T'を削除し、問題を修正しました。それでも、スタンドアロンのiOSアップデートでこれを行う必要があるとは思わなかったはずです。 – ack

+0

合意。おそらくAppleにバグレポートの価値があるでしょう。 – ospr

+2

Appleは、「en_AU」などのロケールはユーザーが直面している構成要素であり、定期的に変更する*ことを思い出しました。例えば、1966年頃、en_AUは "£"を使った作業から "$"を使う作業に変更されました。日付形式の文字列は、ユーザー向きロケールの安定性を保証しません。 en_US_POSIXは変更されない固定ロケールであるはずです。しかし、私が上で報告した問題は、en_US_POSIXでまだ残っています... 文字列フォーマッタと文字列が一致しなかったときに有効なNSDateが返されたということ自体がバグです。これはiOS9で修正されているようだ。 – ack

3

これは私の問題を解決しました。それを使用することもできます。客観Cで

:スウィフトで

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 

let dateFormatter = NSDateFormatter()  
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
関連する問題