2

文字列「2012年6月11日午後9時30分」をNSDateに変換していますが、何らかの理由で4時間先に進んでいます。面白いことに、これと同じ文字列を使用して、同じ変換を実行する必要がある詳細ビューでUIDatePickerにフィードし、UIDatePickerは時間を適切にレンダリングします。メインビューと詳細ビューでNSLogを実行しようとした場合にのみ、問題が発生します。

これは私の見解です:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM dd, yyyy h:mma"];  
NSDate *dateFromString = [[[NSDate alloc] init]autorelease];

NSLog(@"DATE %@", _date);

dateFromString = [formatter dateFromString:_date];

NSLog(@"NSDATEFROMSTRING %@", dateFromString);

NSLogは以下を返します:

2012-06-11 00:02:09.136 LocalDeals[78090:207] DATE Jun 11, 2012 9:30 PM
2012-06-11 00:02:09.137 LocalDeals[78090:207] NSDATEFROMSTRING 2012-06-12 01:30:00 +0000

追加しても:

[formatter setTimeZone:[NSTimeZone defaultTimeZone]];

いつでも同じ結果が得られます。何か案は?ちなみにこれはシミュレーター上にあり、はい、私のリージョンフォーマットは米国に設定されています。

4

2 に答える 2

2

NSDateをNSLogすると、時刻がGMTタイムゾーンとして出力されます。正しいデータを表示するには、を使用してNSDateを文字列に変換する必要があります。stringFromDate

NSDate *dateFromString = [[[NSDate alloc] init]autorelease];

NSLog(@"DATE %@", _date);

//Instead of nslog directly, use this stringFromDate:remindOn
NSString *str = [formatter stringFromDate:dateFromString];
NSLog(@"date is %@", str); //This will log the correct data

発生している問題はNSDateにはありませんが、Logging itUPDATEに あります。データをファイルまたはデータベースに保存するには、次のように保存することをお勧めします。

NSTimeInterval timeInterval  = [dateFromString timeIntervalSince1970];

これで、データベースからもう一度読み取ると、次のようになります。

NSDate *data = [[NSDate alloc] initWithTimeIntervalSince1970:timeInterval]
于 2012-06-11T04:47:11.367 に答える
1

次のコードは、タイムゾーンでの時間を示します。

NSString *_date = @"Jun 11, 2012 9:30 PM";

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"MMMM dd, yyyy h:mma"];  
[formatter2 setDateFormat:@"MMMM dd, yyyy h:mma Z"];  

NSDate *dateFromString = [[NSDate alloc] init];

NSLog(@"DATE %@", _date);

dateFromString = [formatter dateFromString:_date];

NSLog(@"NSDATEFROMSTRING %@", dateFromString);
NSLog(@"NSDATEFROMSTRING %@", [formatter stringFromDate:dateFromString]);
NSLog(@"NSDATEFROMSTRING %@", [formatter2 stringFromDate:dateFromString]);

結果:

DATE Jun 11, 2012 9:30 PM
NSDATEFROMSTRING 2012-06-12 04:30:00 +0000
NSDATEFROMSTRING June 11, 2012 9:30PM
NSDATEFROMSTRING June 11, 2012 9:30PM -0700

今すぐUTCTimeをGoogleで検索すると、出力の2行目に近い時刻が表示され、UTC時刻として時刻が出力されていることが確認されます。

(私たちは異なるタイムゾーンにdateFromStringいて、文字列内の時間を現地時間として解釈しています。)

于 2012-06-11T05:03:36.333 に答える