問題が発生しています。着信時間文字列を12時間形式で取得し、それらをNSDateオブジェクトに変換しています。 iPhoneが12時間形式の場合、問題ありません。しかし、24時間形式の場合、問題が発生します。デモ用のサンプルコードは次のとおりです。
NSString *theTime = @"3:19 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"h:mm a"]; // "3:19 PM"
NSDate *date = [formatter dateFromString:theTime];
NSString *theString = [formatter stringFromDate:date];
24時間モードでは、dateは1970-01-01 03:19:00であり、theStringは "3:19"です-間違っています
12時間モードでは、dateは1970-01-01 15:19:00であり、theStringは "3:19 PM"です-右
だから...質問1:デバイスの24時間設定が私の日付フォーマッター設定を上書きするのはなぜですか?
さらに重要なのは、質問2:12時間制から24時間制に適切に変換するにはどうすればよいですか。
電話が24時間モードであるかどうかを検出するコードはすでにありますが、文字列を掘り下げて3を15に交換する以外に、これを行うためのクリーンな方法はないようです。
それでも必要かどうかはわかりませんが、日付フォーマッターのロケールを設定することで解決した同様の問題がありました。つまり、ユーザーの24/12時間モードの設定に関係なく、強制的に12時間モードにする場合は、ロケールをen_US_POSIXに設定する必要があります。
この動作の理由はロケールです。正しいロケールを設定してください
NSString * strAgendaDate = @ "01/17/2012 12:00 AM"; NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; [ dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@ "en_US"] autorelease]; [dateFormatter setDateFormat:AgendaDateFormatForMeeting]; NSDate * MeetingDate = [dateFormatter dateFromString:a ]; [dateFormatter setDateFormat:AgendaDateRepresentation]; strAgendaDate = [dateFormatter stringFromDate:meetingDate];
24時間形式と12時間形式の両方で機能します
@ "hh:mm:ss"から@ "HH:mm:ss"に変更し、時間スタイルをから変更しました「1:03 PM」から「13:03」。これがお役に立てば幸いです。
@ "h:mma"は@ "HH:mma"である必要があると思います。
ココアでビルド済みのdateformatterを使用すると、すべてが自動的に処理されます。
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
[timeFormatter setDateStyle:NSDateFormatterNoStyle];
NSDateFormatterShortStyle
とNSDateFormatterNoStyle
にはさまざまな種類があります。これらを使用すると、ユーザーが日付と時刻に対して選択した設定を確実に尊重できます。
12〜14時間のクロック変換は、SDKによって処理されます。日付を格納するためのモデルまたは値オブジェクトがある場合は、それらをNSDate
として保持してください。このようにして、表示する必要がある場合にのみフォーマットできます。日付を文字列として保存すると、GMTが個別に指定されているxmlから日付を解析したり、NSTimeIntervals
を加算および減算しようとしたりすると、問題が発生する可能性があります。
さて、私はコメントを残しました、しかしそれはすべてのコードを一緒に押しつぶしたので、私はコメントで私の質問に「答える」必要があります:
ありがとう。私はそれにこのコードで旋回を与えました:
NSString *theTime = @"3:19 PM";
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
[timeFormatter setDateStyle:NSDateFormatterNoStyle];
NSDate *date = [timeFormatter dateFromString:theTime];
NSString *theString = [timeFormatter stringFromDate:date];
そして、日付はゼロになります。このルートを試したときにこれに遭遇しましたが、機能していません。非常にイライラします。