【问题标题】:Getting Correct Date From JSON Formatted Value从 JSON 格式的值中获取正确的日期
【发布时间】:2013-05-29 17:54:29
【问题描述】:

我无法在 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

第一行是区间输出。
其次是使用 dateWithTimeInteralSince1970 进行转换后,显示自动添加的 1 小时。
第三是我调用它的函数的返回值 - 显示手动减去的小时(-3600)。

【问题讨论】:

  • 不清楚你想用上面的“offset”做什么。我没有看到你在哪里使用它。
  • 也许您应该在问题的顶部发布您实际从您的价值中获得的结果。 (The web 给我 2013 年 5 月 13 日星期一 18:07:01 GMT。)
  • (你在哪个时区?)
  • @HotLicks 为了清楚起见,我已经编辑了我的问题。我在 GMT 时区。当我在 epochconverter.com 转换“/Date(1369835402000)/”时,我得到“Wed, 2013 年 5 月 29 日 13:50:02 GMT”,但正如您在上面看到的,我得到“2013-05-29 14:50:02 IST " 来自我上面的方法,比我传入的实际值提前 1 小时。
  • IST 是印度标准时间,这很好奇。你有没有用普通的旧 NSLog 转储你的 NSDate,没有格式化它??

标签: ios xcode nsdate nsdateformatter


【解决方案1】:

这就是我的做法:

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

其中 stringBetween:and: 顾名思义。

【讨论】:

  • 感谢您的回复。当我使用你的建议时,我得到一个 1970 年的日期。我在 dateFromDotNet 中编辑了上述方法:
  • 即使我的系统时间设置为 GMT,我也获得了 IST 时间。我的后端存储的时间是正确的。
  • 在模拟器中运行这个:NSLog(@"%@", [NSDate dateWithTimeIntervalSince1970:([@"1368468421000" doubleValue] / 1000)]);给我输出:“2013-05-13 18:07:01 +0000”
  • 抱歉,我传入了一个错误的值,它返回了 1970 年的日期和时间。不过,上述问题仍在发生 - 我得到的是 GMT + 1 小时的返回日期。即使我没有专门格式化时区,它也比我传递的时间提前了一个小时。
  • @motionpotion - 你根本没有定义你如何看待各种算法产生的日期。如果您只是 NSLog 它应该给您 GMT 的日期。有很多方法可以破坏它的格式。 (你认为什么是“正确”的值?)
猜你喜欢
  • 2020-05-18
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2019-12-27
  • 2012-02-01
  • 2016-11-17
  • 2014-06-28
相关资源
最近更新 更多