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

Posted

技术标签:

【中文标题】iPhone:将格林威治标准时间转换为当地时间【英文标题】:iPhone: convert GMT to local time 【发布时间】:2014-02-12 19:01:57 【问题描述】:

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

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

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

0

但是当我尝试在我的 iPhone 5 上使用我的应用程序时,输出更改为

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


谢谢,

【问题讨论】:

***.com/questions/6613110/… 感谢问题解决:) 【参考方案1】:

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

【讨论】:

但是OP的问题是他没有设置语言环境。 不,OP的问题是他直接登录了NSDate。这调用了 NSDate 的描述方法,它以 GMT 显示日期。日期格式化程序将默认为用户的当前语言环境。如果您需要不同的语言环境(不同的时区或不同的时间格式),您可以更改它,但很可能默认语言环境是正确的。 看看他记录了什么——一个显示AM,另一个没有。经典语言环境问题的明显迹象。如果您不相信,请点击链接。 Hot Licks 解决了我的问题,谢谢你们,格式没有问题,我的应用程序的想法是从服务器接收时间并将其转换为本地时间。现在一切正常。 AM和PM的问题【参考方案2】:

希望这个扩展会更容易。

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

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)")

【讨论】:

以上是关于iPhone:将格林威治标准时间转换为当地时间的主要内容,如果未能解决你的问题,请参考以下文章

如何将 GMT 时间转换为 IST?

如何获得格林威治标准时间的当前时间? [复制]

如何转换为格林尼治标准时间

如何将日期/时间从 GMT 转换为本地时区

中国标准时间(如:2019-08-20 17:43)转换成格林尼治时间方式方法

获取格林威治标准时间