2017-04-27 90 views
-1
 let dateFormatter = DateFormatter() 
     let dateFormatter2 = DateFormatter() 

     dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 

     dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 

     let date = dateFormatter.date(from: event!) 

     dateFormatter2.timeZone = TimeZone.current 
     let dateString = dateFormatter2.string(from: date!) 

     let finalDate = dateFormatter2.date(from: dateString) 
     return finalDate! 

我有体育赛事给了我UTC的字符串日期,我试图将其转换为当地时间。这个代码与本网站提供的几十个示例类似,当问这个问题时,它却不起作用。为什么不从UTC到本地代码的转换工作?

+0

添加的时间差,很有可能你是什么事件的格式。 –

+2

什么是输入和实际和预期输出?为什么要转换String - > Date - > String - > Date?请注意,“日期”描述了绝对时间点,**没有时区**。 –

+0

@丹尼尔不,不要在格式化程序中引用'Z'。 – rmaddy

回答

1

这是ISO8601格式:

static let iso8601: DateFormatter = { 
    let formatter = DateFormatter() 
    formatter.calendar = Calendar(identifier: .iso8601) 
    formatter.locale = Locale(identifier: "en_US_POSIX") 
    formatter.timeZone = TimeZone(secondsFromGMT: 0) 
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" 
    return formatter 
}() 

这将您的字符串转换成Date

您将需要通过TimeZone.autoupdatingCurrent

+0

你能解释我如何添加时差?在我从字符串中提取日期之后,还是之前执行此操作? –

+0

那么你可以先在我给你展示的代码中将时区更改为TimeZone.autoUpdatingCurrent,然后添加TimeZone.autoUpdatingCurrent.daylightSavingsTimeOffset() – SeanLintern88