2011-06-24 8 views
1

まずコード:時間を解析iOSのNSDateFormatterができ、適切

NSString* dateTimeString = [NSString stringWithFormat:@"%@%@", [aDictionary objectForKey:@"date"], [aDictionary objectForKey:@"time"]]; 

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
[dateFormatter setDateFormat:@"yyyyMMddHHmm"]; 

NSDate* dsate = [dateFormatter dateFromString:dateTimeString]; 

dateTimeString文字列値が "201106242204"

dsdateはそれが示してデバッガでは、不正な値を取得しますがあります:2011-06- 24 19:04:00 +0000

あなたは時間が22ではないことがわかります。私はすでにこれでかなりの時間を無駄にしています。タイムゾーン、ロケールなどを設定しようとしましたが、何も効果がありません。

+0

デバイスのタイムゾーン設定を変更し、日付の時間が変更されているかどうかを確認してください。これは、少なくともこれがタイムゾーンの問題であるかどうかを教えてくれるでしょう。 – pepsi

+0

開発用マックのタイムゾーンがUKに設定されていて、NSDateFormatterによって返された日付に影響しました。だから私はどのようにこの醜さを考慮する必要がありますか? –

+0

私はRyanRの提案を受け取ります。 setFormat文字列でタイムゾーンを指定しない場合は、デフォルトではローカルタイムゾーンに設定されていないようです。ゾーンフォーマットパターンを使用してタイムゾーンを取得することができます:http://unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns – pepsi

答えて

2

NSDateFormatter is locale-awareに注意してください。つまり、日付書式文字列を指定しても、デバイス上の現在のロケールが指定した文字列の書式と異なる場合は、書式設定文字列を上書きします。あなたの現在の場所であなたのUTCオフセットは何ですか? NSDateFormatterは常にUTC時刻を返します。オフセットが-6の場合、別のタイムゾーンにある正しい値を返すようになります。 NSDateFormatterの機能の1つ私は本当に好きではありません。 date formatterでsetTimeZone:を呼び出して、必要な結果を得ることができます。

パースされたNSDateインスタンスで-descriptionWithCalendarFormat:timeZone:locale:を呼び出して、ロケールとタイムゾーンを渡してみてください。私はそれがあなたの望む結果を出力するかどうか不思議です。

+0

私は夏にはhttp://en.wikipedia.org/wiki/Finland +3、それ以外の場合は+2です。私もこれを試みた:[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:60 * 60 * 3]];しかし、助けにはならない。 –

+0

私は混乱しています - あなたのデバッガ出力は19:04を示していますが、あなたの状態は「16」と表示されます。デバッガの出力を見ると、ローカルタイムゾーンの22:04がUTCの19:04であるため、間違いなくタイムゾーンの違いがあるようです。日付文字列の一部としてタイムゾーンオフセットを渡そうとしましたか? – RyanR

+0

申し訳ありませんが16、それは打ち間違いでした、19.する必要がありますどのように私は日付の文字列でtzのオファーを渡すことができますか? –

1

最後に私はこれを解決しました。方法:

NSString* dateTimeString = [NSString stringWithFormat:@"%@%@", [aDictionary objectForKey:@"date"], [aDictionary objectForKey:@"time"]]; 

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
NSTimeZone* normalTimeZone = [NSTimeZone timeZoneWithName:@"EET"]; 

[dateFormatter setDateFormat:@"yyyyMMddHHmm"]; 

NSDate* date = [dateFormatter dateFromString:dateTimeString]; 
NSDate* correctedDate = [date dateByAddingTimeInterval:[normalTimeZone secondsFromGMT]]; 

ココアやiOSには、少なくともスマートに行動しようとするAPIが必要です。

関連する問題