1

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

资源:

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

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]);
}

输出:

间隔毫秒:1384193573000

original date: 01:12 2013-11-11 //当前时区日期: America/Phoenix

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

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

4

2 回答 2

2

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

于 2013-11-13T18:37:53.660 回答
1

您的服务器发送自 1970 年 1 月13841935730001 日以来的时间(以毫秒为单位),但不是像通常那样相对于 GMT,而是相对于不同的时区,在您的示例中为“美国/凤凰城”。

因此,您必须先添加一个更正,这是“美国/凤凰城”和 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
于 2013-11-13T19:16:08.713 回答