我在将时间字符串转换为不同的时区时遇到问题。
这是我从服务器检索的字符串示例:@"5/14/2013 4:19am"
我知道时区是 America/New_York,我想将其转换为我的本地时区:Europe/Rome。
这是我为测试它而编写的代码:
-(void) convertTimeZone
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.timeZone=[NSTimeZone timeZoneWithAbbreviation:@"GMT"];
dateFormatter.dateFormat=@"MM/dd/yyyy HH:mma";
NSString *sourceDateString = @"5/14/2013 4:19am";
NSTimeZone *sourceTimeZone = [[NSTimeZone alloc] initWithName:@"America/New_York"];
NSTimeZone *destinationTimeZone = [NSTimeZone localTimeZone];
NSInteger sourceGMToffset = sourceTimeZone.secondsFromGMT;
NSInteger destinationGMToffset = destinationTimeZone.secondsFromGMT;
NSInteger interval = destinationGMToffset-sourceGMToffset;
NSLog(@"DateFormatter TimeZone: %@", dateFormatter.timeZone);
NSLog(@"Source TimeZone: %@", sourceTimeZone);
NSLog(@"Destination TimeZone: %@", destinationTimeZone);
NSLog(@"sourceOffset: %u destinationOffset: %u interval: %u", sourceGMToffset, destinationGMToffset, interval);
NSLog(@"----------------------------------------------------------------------------------------------------");
NSLog(@"sourceDateString : %@", sourceDateString);
//Convert from string to date
NSDate *dateObject = [dateFormatter dateFromString:sourceDateString];
NSLog(@"From string to date: %@", dateObject);
//Now back from date to string
NSLog(@"From date to string: %@", [dateFormatter stringFromDate:dateObject]);
//Convert from sourceTimeZone to destinationTimeZone
NSDate *newDate = [[NSDate alloc] initWithTimeInterval: interval sinceDate:dateObject];
NSLog(@"destinationDateString: %@", [dateFormatter stringFromDate: newDate]);
}
输出:
DateFormatter 时区:GMT (GMT) 偏移量 0
源时区:America/New_York (GMT-04:00) 偏移量 -14400(日光)
目的地时区:本地时区(欧洲/罗马 (CEST) 偏移 7200(日光))
sourceOffset:4294952896 destinationOffset:7200 间隔:21600
来源日期字符串:2013 年 5 月 14 日凌晨 4 点 19 分
从字符串到日期:2013-05-14 00:19:00 +0000
从日期到字符串:05/14/2013 00:19AM
目的地日期字符串:2013 年 5 月 14 日上午 6 点 19 分
我要生气了!!!!
如果原始日期是“5/14/2013 4:19am”为什么日期格式化程序将其更改为“05/14/2013 00:19AM”????????? 如果它已正确保存到“05/14/2013 04:19AM +0000”,则转换将是完美的(两个时区之间为 6 小时)!!!
有什么提示吗?
谢谢
尼古拉
编辑
按照 lithu-tv 的建议设置这些参数:
dateFormatter.timeZone=[NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSString *sourceDateString = @"5/14/2013 4:19am -0400";
它似乎有效,但它没有。
我说“似乎”是因为:
sourceDateString: 5/14/2013 04:19am -0400
从字符串到日期:2013-05-13 04:19:00 +0000 (OK)
从日期到字符串:05/14/2013 04:19 (OK)
目的地日期字符串:2013 年 5 月 14 日 10:19(正确)
是正确的,但如果我在下午晚些时候尝试:
来源日期字符串:2013 年 5 月 14 日晚上 10:19 -0400
从字符串到日期:2013-05-14 16:19:00 +0000(错误)
从日期到字符串:05/14/2013 16:19
目的地日期字符串:2013 年 5 月 14 日 22:19(错误!)
正确的结果应该是:05/15/2013 04:19AM