将UTCdate格式转换为本地nsdate

我从我的服务器获取UTC时区的stringdate,我需要将其转换为本地时区。

我的代码:

let utcTime = "2015-04-01T11:42:00.269Z" let dateFormatter = NSDateFormatter() dateFormatter.timeZone = NSTimeZone(name: "UTC") dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" let date = dateFormatter.dateFromString(utcTime) println("utc: \(utcTime), date: \(date)") 

这打印 –

utc:2015-04-01T11:42:00.269Z,date:可选(2015-04-01 11:42:00 +0000)

如果我删除

 dateFormatter.timeZone = NSTimeZone(name: "UTC") 

它打印

utc:2015-04-01T11:42:00.269Z,date:可选(2015-04-01 08:42:00 +0000)

我的本地时区是UTC +3,在第一个选项我得到UTC在第二个选项我得到UTC -3

我应该得到

utc:2015-04-01T11:42:00.269Z,date:可选(2015-04-01 14:42:00 +0000)

那么如何将UTCdate格式转换为当地时间呢?

在Objective-C中,以下内容适用于我:

 // create dateFormatter with UTC time format NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; NSDate *date = [dateFormatter dateFromString:@"2015-04-01T11:42:00"]; // create date from string // change to a readable time format and change to local time zone [dateFormatter setDateFormat:@"EEE, MMM d, yyyy - h:mm a"]; [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; NSString *timestamp = [dateFormatter stringFromDate:date]; 

我保留这两个网站方便转换不同的时间格式: http : //www.w3.org/TR/NOTE-datetime

http://benscheirman.com/2010/06/dealing-with-dates-time-zones-in-objective-c/

在Swift中将会是:

 // create dateFormatter with UTC time format let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" dateFormatter.timeZone = NSTimeZone(name: "UTC") let date = dateFormatter.dateFromString("2015-04-01T11:42:00")// create date from string // change to a readable time format and change to local time zone dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" dateFormatter.timeZone = NSTimeZone.localTimeZone() let timeStamp = dateFormatter.stringFromDate(date!) 

swift版c_rath的答案:

 // create dateFormatter with UTC time format let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" dateFormatter.timeZone = NSTimeZone(name: "UTC") let date = dateFormatter.dateFromString("2015-04-01T11:42:00") // change to a readable time format and change to local time zone dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" dateFormatter.timeZone = NSTimeZone.localTimeZone() let timeStamp = dateFormatter.stringFromDate(date!) 

扩展其他人提到的,这里是Swift中的一个方便的NSDate扩展

 import Foundation extension NSDate { func ToLocalStringWithFormat(dateFormat: String) -> String { // change to a readable time format and change to local time zone let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = dateFormat dateFormatter.timeZone = NSTimeZone.localTimeZone() let timeStamp = dateFormatter.stringFromDate(self) return timeStamp } } 

在Swift 3中,这个效果很好:

 // create dateFormatter with UTC time format let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" dateFormatter.timeZone = TimeZone(abbreviation: "UTC") let date = dateFormatter.date(from: "2015-04-01T11:42:00")// create date from string // change to a readable time format and change to local time zone dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" dateFormatter.timeZone = TimeZone.current let timeStamp = dateFormatter.string(from: date!) 

也许你可以尝试像这样的东西:

 extension NSDate { convenience init(utcDate:String, dateFormat:String="yyyy-MM-dd HH:mm:ss.SSS+00:00") { // 2016-06-06 00:24:21.164493+00:00 let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = dateFormat dateFormatter.timeZone = NSTimeZone(name: "UTC") let date = dateFormatter.dateFromString(utcDate)! let s = NSTimeZone.localTimeZone().secondsFromGMTForDate(date) let timeInterval = NSTimeInterval(s) self.init(timeInterval: timeInterval, sinceDate:date) } } 

我必须从c_rath解决scheme中删除z和毫秒。 迅速工作4。

 extension String { func fromUTCToLocalDateTime() -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" dateFormatter.timeZone = TimeZone(abbreviation: "UTC") var formattedString = self.replacingOccurrences(of: "Z", with: "") if let lowerBound = formattedString.range(of: ".")?.lowerBound { formattedString = "\(formattedString[..<lowerBound])" } guard let date = dateFormatter.date(from: formattedString) else { return self } dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" dateFormatter.timeZone = TimeZone.current return dateFormatter.string(from: date) } }