Xcode で JSON 形式のタイムスタンプを NSDate に変換する際に問題が発生しています。
たとえば、RESTful Web サービスから次の形式のタイムスタンプが返されます: "/Date(1369835402000)/"。
[編集]
実際に返される値と渡す値を明確にするために、この編集を行います。
上記のタイムスタンプを NSDate に変換すると、次のような時間が得られます。
ご覧のとおり、タイムゾーンを設定していなくても、返される日付は実際の日付より 1 時間進んでいます。
現在、次の方法を使用してタイムスタンプを日付に変換しています。
- (NSDate*) getDateFromJSON:(NSString *)dateString
{
// Expect date in this format "/Date(1369835402000)/"
int startPos = [dateString rangeOfString:@"("].location+1;
int endPos = [dateString rangeOfString:@")"].location;
NSRange range = NSMakeRange(startPos,endPos-startPos);
unsigned long long milliseconds = [[dateString substringWithRange:range] doubleValue];
NSLog(@"%llu",milliseconds);
NSTimeInterval interval = milliseconds/1000;
return [NSDate dateWithTimeIntervalSince1970:interval];
}
ただし、値は 1 時間先として返されます。
[編集]
NSLog から要求された DUMP と、それを作成するコードを以下に示します。
- (NSDate*) getDateFromJSON:(NSString *)dateString
{
// Expect date in this format "/Date(1369835402000)/"
int startPos = [dateString rangeOfString:@"("].location+1;
int endPos = [dateString rangeOfString:@")"].location;
NSRange range = NSMakeRange(startPos,endPos-startPos);
unsigned long long milliseconds = [[dateString substringWithRange:range] longLongValue];
NSTimeInterval interval = milliseconds/1000;
NSLog(@"%f", interval);
NSLog(@"%@", [NSDate dateWithTimeIntervalSince1970:interval]);
interval -= 3600;
return [NSDate dateWithTimeIntervalSince1970:interval];
}
サンプルダンプ:
2013-05-30 09:58:47.616 Log[13734:907] 1365693200.000000
2013-05-30 09:58:47.619 Log[13734:907] 2013-04-11 15:13:20 +0000
2013-05-30 09:58:47.620 Log[13734:907] 2013-04-11 14:13:20 +0000
2013-05-30 09:58:47.621 Log[13734:907] 1358157335.000000
2013-05-30 09:58:47.622 Log[13734:907] 2013-01-14 09:55:35 +0000
2013-05-30 09:58:47.622 Log[13734:907] 2013-01-14 08:55:35 +0000
2013-05-30 09:58:47.628 Log[13734:907] 1365684042.000000
2013-05-30 09:58:47.629 Log[13734:907] 2013-04-11 12:40:42 +0000
2013-05-30 09:58:47.630 Log[13734:907] 2013-04-11 11:40:42 +0000
2013-05-30 09:58:47.632 Log[13734:907] 1358157374.000000
2013-05-30 09:58:47.632 Log[13734:907] 2013-01-14 09:56:14 +0000
2013-05-30 09:58:47.633 Log[13734:907] 2013-01-14 08:56:14 +0000
2013-05-30 09:58:47.638 Log[13734:907] 1365684238.000000
2013-05-30 09:58:47.639 Log[13734:907] 2013-04-11 12:43:58 +0000
2013-05-30 09:58:47.640 Log[13734:907] 2013-04-11 11:43:58 +0000
最初の行はインターバル出力です。
2 番目は、dateWithTimeInteralSince1970 を使用した変換後で、1 時間が自動的に追加されたことを示しています。
3 番目は、呼び出し元の関数からの戻り値です。手動で減算された時間 (-3600) を示しています。