web-dev-qa-db-ja.com

iOSでの日付/時刻の解析:タイムゾーンを処理する(または処理しない)方法は?

JSONを介してiOSアプリと通信するASP.NETMVC 3Webサイトがあります。 JSON応答で送信されるオブジェクトの一部として、yyyy-MM-dd HH:mm:ss ZZZを出力する2011-04-05 16:28:22 -07:00の形式の日付があります。 iOSでそれを解析するにはどうすればよいですか?

これは私が今いじっているコードです:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
NSDate *date = [dateFormatter dateFromString:@"2011-04-05T16:28:22-0700"];

NSLog(@"%@; %@; %@", dateFormatter, date, [NSTimeZone localTimeZone]);

最初に注意することは、2011-04-05 16:28:22 -07:002011-04-05T16:28:22-0700のように見える必要があることです。ここで、Tは最初のスペースを置き換えます(それが時間を表す、または文字列の時間部分が始まると仮定します) ?)、2番目のスペースが削除され、タイムゾーンのコロンが削除されます。 iOSが解析する文字列に準拠するために.NETが送り返す文字列をフォーマットする方法を見つけることができると思います。

本当の問題は、出力される日付が、JSON応答で送信した日付より7時間進んでいることです。したがって、iOSは2011-04-05 16:28:22 -07:002011-04-05 23:28:22 +0000として出力しますが、私のアプリに関する限り、これは間違っています。

これまでに見つけた唯一の解決策は、JSONで日付を2011-04-05 16:28:22 +00:00として送信することですが、実際の日付を変更しているため、これも間違っています。

とにかく、誰かが見て、.NETが出力している日付文字列をyyyy-MM-dd HH:mm:ss ZZZyyyy-MM-ddTHH:mm:ssZZZに書き換えることができると思います)の形式で解析する方法を教えていただければ幸いです。 iOSで使用できるNSDateオブジェクト。

16
Gup3rSuR4c

これがどれほど正しいかはわかりませんが、最終的には.NETではDateTime.ToUniversalTime().ToString("yyyy-MM-ddHH:mm:ss")を実行する必要があり、iOS側ではこれを実行する必要があることがわかりました。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-ddHH:mm:ss"];
NSDate *date = [dateFormatter dateFromString:@"2011-04-0600:28:27"];

その場合にのみ、NSLogが出力される日付が正しいので、最終的に適切な日付/時刻が得られたと思います。

14
Gup3rSuR4c

IOSの日付解析コードは正しいです:2011-04-05 16:28:22 -07:00および2011-04-05 23:28:22 +0000は、異なるタイムゾーンで同じ時間を表します。唯一の問題は、NSDateが実際にはタイムゾーンを保存しないため、[date description]UTCを使用して出力します。

6
Anomie

ほぼ間違いなく、交換のためにどこでもUTC時間を使用し、タイムゾーンを気にしないほうがよいでしょう。 ASP.NETコードでそれを実行できると確信しており、受信側でも解析が簡単です。 NSDateFormatterは、標準のUnicode日付フォーマット構文を使用します。これについては、 ここ について読むことができます。

2
Nicholas Riley