Ios iPhone:将格林尼治标准时间转换为当地时间

Ios iPhone:将格林尼治标准时间转换为当地时间,ios,objective-c,swift,date,nstimezone,Ios,Objective C,Swift,Date,Nstimezone,当我从Xcode iPhone模拟器转换时间时,我的代码工作正常,输出如下所示: 2014-02-12 18:11:52+0000 当地时区(欧洲/伦敦(GMT)偏移0) 0 但当我尝试在iPhone5上使用我的应用程序时,输出变为 1970-01-01 12:00:00 am+0000 当地时区(欧洲/伦敦(GMT)偏移0) 0 我使用的是xcode 5.0和iOS 7 -(NSDate *)convertGMTtoLocal:(NSString *)gmtDateStr { NSD

当我从Xcode iPhone模拟器转换时间时,我的代码工作正常,输出如下所示:

2014-02-12 18:11:52+0000

当地时区(欧洲/伦敦(GMT)偏移0)

0

但当我尝试在iPhone5上使用我的应用程序时,输出变为

1970-01-01 12:00:00 am+0000

当地时区(欧洲/伦敦(GMT)偏移0)

0

我使用的是xcode 5.0和iOS 7

-(NSDate *)convertGMTtoLocal:(NSString *)gmtDateStr {

    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSTimeZone *gmt = [NSTimeZone systemTimeZone];

    [formatter setTimeZone:gmt];

    NSDate *GMTTime = [formatter dateFromString:gmtDateStr];

    NSTimeZone *tz = [NSTimeZone localTimeZone];
    NSLog(@"%@",tz);
    NSInteger seconds = [tz secondsFromGMTForDate: GMTTime];
    NSLog(@"%ld",(long)seconds);
    NSLog(@"%@",[NSDate dateWithTimeInterval: seconds sinceDate: GMTTime]);
    return [NSDate dateWithTimeInterval: seconds sinceDate: GMTTime];

}

谢谢,

NSLog以格林尼治标准时间记录日期。不要使用它。创建一个日期格式化程序并使用它记录日期。另一张海报的代码完全是反向的,它会将日期转换为GMT。在vborra的代码中去掉setTimeZone调用,它会以当地时间给出日期

代码可能如下所示:

  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  [dateFormatter setDateStyle:NSDateFormatterNoStyle];
  [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
  NSString *time = [dateFormatter stringFromDate:[NSDate date]];
  NSLog(@"Time is %@", time);

希望这次延期会更容易些

Swift 4:UTC/GMT⟺ 本地(当前/系统)


谢谢问题解决:)但是OP的问题是他没有设置区域设置。不,OP的问题是他直接记录了NSDate。这将调用NSDate的description方法,该方法以GMT显示日期。日期格式化程序将默认为用户的当前区域设置。如果您需要不同的区域设置(不同的时区或不同的时间格式),您可以更改它,但最有可能的是默认区域设置将是正确的。查看他记录的内容—一个显示AM,另一个不显示AM。这是典型的区域设置问题的明显迹象。如果你不相信,请点击链接。热舔可以解决我的问题谢谢大家,格式没有问题,我的应用程序的想法是从服务器接收时间并将其转换为本地时间。现在一切正常。上午和下午的问题
extension Date {

    // Convert local time to UTC (or GMT)
    func toGlobalTime() -> Date {
        let timezone = TimeZone.current
        let seconds = -TimeInterval(timezone.secondsFromGMT(for: self))
        return Date(timeInterval: seconds, since: self)
    }

    // Convert UTC (or GMT) to local time
    func toLocalTime() -> Date {
        let timezone = TimeZone.current
        let seconds = TimeInterval(timezone.secondsFromGMT(for: self))
        return Date(timeInterval: seconds, since: self)
    }

}


// Try it
let utcDate = Date().toGlobalTime()
let localDate = utcDate.toLocalTime()

print("utcDate - (utcDate)")
print("localDate - (localDate)")