2016-10-04 71 views
-1

我試圖獲取當前日期爲AWS安全憑證的特定格式(YYYYMMD)印刷和我注意到,當我做Date(),天是這是正確的值4:天的日期()和Calendar.dateComponents不匹配

let date = Date() 
    print("\(date)") //2016-10-04 00:56:28 +0000 

現在,我想打印在我渴望這樣的格式的日期,但我不斷收到當天的值是3:

let calendar = Calendar.current 
    let date = Date() 
    let components = calendar.dateComponents([.day], from: date) 
    print("\(components.day)") //Optional(3) 

S3預計日期將是第四。我怎樣才能解決這個問題?

+2

區是什麼時候返回的值你的開發手機爲?公平地說,在你的時區,日期實際上是午夜前的第三天,但是當你以UTC顯示時,它顯示爲第四天。 –

回答

1

這是因爲時差的。 date將返回UTC時間和日期,但calendar將根據設備的時區返回日期和時間。如果您需要在UTC天數只設置日曆對象的時區爲UTC創建後:

let calendar = Calendar.current 
calendar.timeZone = TimeZone(abbreviation: "UTC")! 

現在,它總是會匹配由Date()

+0

儘管創建新的公曆日曆並將該日曆的時區設置爲UTC可能會更好。不會更改當前日曆的時區可能會在應用程序的其餘部分中弄亂日曆操作? –

+0

@DuncanC它只會改變這個「日曆」對象的時區。它不會更改「當前」日曆。 –

+0

但是,創建一個新的格里曆日曆可以使其在所有區域中都安全。 –

1

打印時使用

print("\(date)") 

你獲得UTC日期和時間,這可能不是你想要的日期。

如果你想在你的本地時區來顯示你的約會,創建日期格式和使用:

let dateFormatter = NSdateFormatter() 
let dateFormatter.dateStyle = .medium 
let dateFormatter.timeStyle = .medium 

let dateString = dateFormatter.StringFromDate(date) 
print ("date = \(dateString)") 

如果你這樣做了很多,你可能想創建的NSDate displayString的擴展,使您可以使用它來顯示日期而無需編寫其他代碼。

+0

所以Heroku創建了一個簽名的請求,其中包含UTC中需要匹配的日期。 – Brosef

+0

創建一個公曆並將其時區設置爲UTC。 Sam_M的答案顯示瞭如何設置日曆的時區,但我建議創建一個新日曆,而不是修改當前日曆。 –