2017-02-22 69 views
2

我刚刚将我的应用程序的代码迁移到Swift 3,并且发现了DateFormatter(以前称为NSDateFormatter),这是我没有用Swift 2或更早版本得到的令人讨厌的问题。无法更改Swift 3中DateFormatter的时区

的问题是,我需要一个字符串转换为Date对象,我的代码,这样做是一样的东西,

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
let dateStr1 = "2017-02-22" 
let date1 = dateFormatter.date(from: dateStr1) 

现在这工作正常,并预期在Xcode游乐场,但是当我尝试运行它从我的应用程序,date1返回2017-02-21 13:00:00 +0000即过去的一天,我需要date1是2017-02-22 fyi,我在澳大利亚,我在哪里做这个发展。

我从我的应用程序的用户界面获取日期字符串,并从用户界面它是2017-02-22,所以我需要将该字符串转换为Swift中的Date(或NSDate)对象。

我已经尝试设置为DateFormatter时区和语言环境,

dateFormatter.timeZone = TimeZone(identifier: TimeZone.current.identifier) 

dateFormatter.locale = Locale.init(identifier: Locale.current.identifier) 

但仍没有运气?

我也试图从创建像日历组件的日期,

var dateComponents = DateComponents() 
var day = "22" 
var month = "02" 
var year = "2017" 
dateComponents.day = Int(day)! 
dateComponents.year = Int(year)! 
print(TimeZone.current) 
dateComponents.timeZone = TimeZone.current 
dateComponents.month = Int(month)! 
let userCalendar = Calendar.current 
let date1 = userCalendar.date(from: dateComponents) 

但仍然没有得到正确的日期,即获得的2017年2月21日,而不是2017年2月22日 我已经看了一些像

How do you create a swift Date object

Converting date between timezones swift

另做题当中OT她的。我如何才能达到我想要的结果的任何想法?此代码在Swift之前完全正常工作。

+0

为什么你认为在你的问题中前4行代码有什么问题?这很好,很正确。 – rmaddy

+1

2月22日在澳大利亚的午夜是UTC时间21日13:00。没有错。 – rmaddy

+0

够公平!我编辑了这个问题以使问题更清楚。 – cptdanko

回答

1

正如maddy在评论中指出的那样,Xcode向您展示了Universal Timezone - UTZ(也称为格林威治标准时间)的“原始形式”中的日期。

要获得在另一个时区显示的日期,您需要再次使用DateFormatter。

所以:

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
let dateStr1 = "2017-02-22" 
let date1: Date = dateFormatter.date(from: dateStr1)! 

print("\(date1)") 
print("\(dateFormatter.string(from: date1))") 

为您提供:

Print screen of code in playground with output.

我跑在西澳大利亚州珀斯这个代码(即UTZ + 8) - 因此,当我转换2月22日-2017保存为2017年2月21日UTZ的日期,但如果使用我的语言环境中的DateFormatter提交回来,我将获得2017年2月22日的午夜。