NSDate和NSDate stringFromDate不一致

时间:2013-11-13 17:50:21

标签: objective-c nsdate nsdateformatter nstimezone

我正在尝试将mysql datetime字段转换为另一个时区。当我打印日期对象时,转换似乎是正确的,但是当我将日期作为字符串打印时,时间是不正确的。源代码和输出如下。

来源:

已编辑 - 以秒为单位打印原始间隔和字符串,添加时区

interval = [NSNumber numberWithDouble: seconds];
NSLog(@"interval in ms: %@",interval); 
self.dateStamp = [[NSDate alloc] initWithTimeIntervalSince1970:seconds/1000];


if(![currentZone.name isEqualToString: timezone]){          //need to convert
    NSDateFormatter *fromTZ = [[NSDateFormatter alloc]init];
    [fromTZ setTimeZone:currentZone];
    [fromTZ setDateFormat:@"hh:mm yyyy-MM-dd"];
    NSLog(@"original date: %@",[fromTZ stringFromDate:self.dateStamp]);
    NSDateFormatter *toTZ = [[NSDateFormatter alloc]init];
    [toTZ setTimeZone:spotZone];
    [toTZ setDateFormat:@"hh:mm yyyy-MM-dd"];
    NSString *tempdate = [fromTZ stringFromDate:self.dateStamp];
    NSDate *toDate = [toTZ dateFromString:tempdate];
    NSLog(@"Date: %@",toDate);
    NSLog(@"Date String: %@", [toTZ stringFromDate:toDate]);
}

输出:

  
    

ms的间隔:1384193573000

         

原始日期:2013-11-11 01:12 //当前时区的日期:America / Phoenix

         

日期:2013-11-11 08:12:00 +0000 //新时区的日期:美国/纽约

         

日期字符串:2013-11-11 01:12

  

2 个答案:

答案 0 :(得分:2)

NSDate没有时区概念,它只是一个对象,表示自格林威治标准时间2001年1月1日以来以秒为单位的秒数。无论您尝试将其设置为什么,当您直接记录NSDate时,它会给您相同的结果。避免这种情况的唯一方法是使用您已经完成的NSDateFormatter。您发布的所有内容都是预期的行为。

答案 1 :(得分:1)

您的服务器发送自1970年1月1日以来的时间1384193573000(以毫秒为单位),但不是GMT,因为它通常已完成,但对于不同的时区,“America / Phoenix”在您的示例

因此你必须首先添加一个修正,这是“America / Phoenix”和GMT之间的区别:

NSTimeInterval serverTime = 1384193573000/1000.;
NSTimeZone *fromZone = [NSTimeZone timeZoneWithName:@"America/Phoenix"];
NSTimeInterval diff = [fromZone secondsFromGMTForDate:[NSDate dateWithTimeIntervalSince1970:0]];
NSDate *dateStamp = [NSDate dateWithTimeIntervalSince1970:(serverTime - diff)];

这是至关重要的一步。 dateStamp现在是一个“正确的”NSDate对象代表 从服务器发送的时间。 剩下的就是显示日期。这是在上面的评论和另一个评论中完成的 回答。例如:

NSTimeZone *toZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
NSDateFormatter *toTZ = [[NSDateFormatter alloc]init];
[toTZ setTimeZone:toZone];
[toTZ setDateFormat:@"HH:mm yyyy-MM-dd"];
NSString *result = [toTZ stringFromDate:dateStamp];

// result = 20:12 2013-11-11