时区反向变化

时间:2014-01-21 17:39:19

标签: iphone objective-c nsdate nsdateformatter

所以我目前正在美国东部时间14:45改为格林尼治标准时间格林威治标准时间19:45,因为这有5个小时的差异。然而,我的代码正在做的是,它正在扭转时间,而不是显示19:45 GMT,这是正确的时间显示09:45,结果是-5小时而不是+5小时,就像我想要的那样。 / p>

这是我目前正在使用的代码

       NSDateFormatter* df_utc = [[NSDateFormatter alloc] init];
        [df_utc setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
        [df_utc setDateFormat:@"HH:mm"];

        NSDateFormatter* df_local = [[NSDateFormatter alloc] init];
        [df_local setTimeZone:[NSTimeZone systemTimeZone]];
        [df_local setDateFormat:@"HH:mm"];

        NSString *ts_utc_string = [df_utc stringFromDate:dateFromString];

        NSString *ts_local_string = [df_local stringFromDate:dateFromString];

        NSLog(@"UTC TIME: %@",ts_utc_string);
        NSLog(@"LOCAL TIME: %@",ts_local_string);

基本上UTC TIME打印09:45而LOCAL TIME:打印14:45,但我希望UTC时间打印19:45。

[NSTimeZone systemTimeZone] = GMT +0;

1 个答案:

答案 0 :(得分:0)

您已将“EST”时区分配给df_utc,并将系统时区(GMT)分配给 df_local。它应该是另一种方式。

请注意[NSTimeZone timeZoneForSecondsFromGMT:0]是获取UTC / GMT的更好方法 时区,不依赖于系统时区。

此外,您将同一日期转换为字符串两次,而不是“string(EST) - > date - > string(UTC)”。以下代码生成您期望的结果:

NSString *ts_local_string = @"14:45";

NSDateFormatter* df_utc = [[NSDateFormatter alloc] init];
[df_utc setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[df_utc setDateFormat:@"HH:mm"];

NSDateFormatter* df_local = [[NSDateFormatter alloc] init];
[df_local setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
[df_local setDateFormat:@"HH:mm"];

NSDate *date = [df_local dateFromString:ts_local_string];
NSString *ts_utc_string = [df_utc stringFromDate:date];

NSLog(@"UTC TIME: %@",ts_utc_string);
NSLog(@"LOCAL TIME: %@",ts_local_string);

输出:

UTC TIME: 19:45
LOCAL TIME: 14:45