从JSON格式化值获取正确的日期

时间:2013-05-29 17:54:29

标签: ios xcode nsdate nsdateformatter

我无法在Xcode中将JSON格式的时间戳转换为NSDate。

例如,我从RESTful Web服务返回以下格式化时间戳:“/ Date(1369835402000)/”。

[编辑]

进行此编辑以清楚显示我实际返回的值以及我传递的值:

当我将上述时间戳转换为NSDate时,我得到的时间如下:

date is 1 hour ahead of actual timestamp

正如您所看到的,即使我没有设置时区,返回的日期也比实际日期提前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];
}

SAMPLE DUMP:

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

第一行是间隔输出 第二个是使用dateWithTimeInteralSince1970进行转换后,显示自动添加1小时 第三个是我称之为函数的返回值 - 显示手动减去小时(-3600)。

1 个答案:

答案 0 :(得分:1)

我就是这样做的:

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

其中stringBetween:和:的名称相同。