我正在尝试将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
答案 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