web-dev-qa-db-ja.com

NSDateFormatterdateFromStringとiPhoneの24時間形式の混乱

問題が発生しています。着信時間文字列を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に交換する以外に、これを行うためのクリーンな方法はないようです。

25
Silromen

それでも必要かどうかはわかりませんが、日付フォーマッターのロケールを設定することで解決した同様の問題がありました。つまり、ユーザーの24/12時間モードの設定に関係なく、強制的に12時間モードにする場合は、ロケールをen_US_POSIXに設定する必要があります。

29
SVD

この動作の理由はロケールです。正しいロケールを設定してください

 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時間形式の両方で機能します

14
Meet

@ "hh:mm:ss"から@ "HH:mm:ss"に変更し、時間スタイルをから変更しました「1:03 PM」から「13:03」。これがお役に立てば幸いです。

6
Vladimir

@ "h:mma"は@ "HH:mma"である必要があると思います。

ココアでビルド済みのdateformatterを使用すると、すべてが自動的に処理されます。

NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
[timeFormatter setDateStyle:NSDateFormatterNoStyle];

NSDateFormatterShortStyleNSDateFormatterNoStyleにはさまざまな種類があります。これらを使用すると、ユーザーが日付と時刻に対して選択した設定を確実に尊重できます。

12〜14時間のクロック変換は、SDKによって処理されます。日付を格納するためのモデルまたは値オブジェクトがある場合は、それらをNSDateとして保持してください。このようにして、表示する必要がある場合にのみフォーマットできます。日付を文字列として保存すると、GMTが個別に指定されているxmlから日付を解析したり、NSTimeIntervalsを加算および減算しようとしたりすると、問題が発生する可能性があります。

6
RickiG

さて、私はコメントを残しました、しかしそれはすべてのコードを一緒に押しつぶしたので、私はコメントで私の質問に「答える」必要があります:

ありがとう。私はそれにこのコードで旋回を与えました:

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]; 

そして、日付はゼロになります。このルートを試したときにこれに遭遇しましたが、機能していません。非常にイライラします。

1
Silromen