2017-02-22 54 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日的午夜。