-2

Xcode で JSON 形式のタイムスタンプを NSDate に変換する際に問題が発生しています。

たとえば、RESTful Web サービスから次の形式のタイムスタンプが返されます: "/Date(1369835402000)/"。

[編集]

実際に返される値と渡す値を明確にするために、この編集を行います。

上記のタイムスタンプを NSDate に変換すると、次のような時間が得られます。

日付は実際のタイムスタンプより 1 時間進んでいます

ご覧のとおり、タイムゾーンを設定していなくても、返される日付は実際の日付より 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) を示しています。

4

1 に答える 1

1

これは私がそれを行う方法です:

[NSDate dateWithTimeIntervalSince1970:([[self stringBetween:@"Date(" and:@")"] doubleValue] / 1000)];

stringBetween:and: は、その名前が示すとおりです。

于 2013-05-29T18:00:25.610 に答える