3
    NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [timeFormatter setDateFormat:@"h:mm a"];
    NSString *fullTime = [timeFormatter stringFromDate:someDateHere];
    NSArray *timeParts = [fullTime componentsSeparatedByString:@" "];
    timeLabel.text = [timeParts objectAtIndex:0];
    ampmLabel.text = [timeParts objectAtIndex:1];

LAST行がクラッシュします

    NSRangeException*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]

これはどのように可能ですか?このコードの直前に返される日付には nil チェックがあります。

4

2 に答える 2

3

データ フォーマット ガイドのドキュメントから (セクション日付フォーマッタ > フォーマット文字列を使用してカスタム フォーマットを指定 > 固定フォーマット):

原則としてフォーマット文字列は固定フォーマットを指定しますが、デフォルトでは NSDateFormater はユーザーの設定 (ロケール設定を含む) を考慮します。... iOS では、ユーザーはデフォルトの AM/PM 対 24 時間制をオーバーライドできます。これにより、NSDateFormatter が設定したフォーマット文字列を書き換える可能性があります。

つまり、24 時間制の iOS デバイスでは、「h:mm a」を指定しても、「6:02 PM」ではなく「18:02」になります。したがって、それをスペースで区切ると、2 つの値ではなく、1 つの値「18:02」が返されます。

于 2012-05-16T01:06:24.793 に答える
1

NSDateFormatterのドキュメントには、次のような警告があります。

フォーマット文字列 ( setDateFormat:) を設定すると、原則として正確なフォーマットが指定されますが、実際には、ユーザーの設定によって上書きされる場合もあります。詳細については、データ フォーマット ガイドを参照してください。

これは、スペースを含まない文字列を生成するためにあなたのケースに適用できますか? (スペースで分割すると長さ 1 の配列になり、表示される場所に例外が表示されます。) フォーマットされた日付をログに記録するか、デバッガーをアタッチして、これを確認してください。

日付形式に関するページの最後では、ローカライズされていstrftime_lない日付/時刻を処理する場合は、plain old を使用することを推奨していることに注意してください。そのほうがあなたに適しているかもしれません。(また、コンピューターにバインドされたデータに AM/PM インジケータが必要ですか? 真剣に? 通常、24 時間制の方がはるかに簡単に操作できます…)

于 2012-05-16T01:13:21.780 に答える