2017-07-14 80 views
0

給定一個日期,我想在4:00得到一個日期。這對於失敗0:00 - 3:39:前一天的日期@ 4am

let date3am = Calendar.current.date(from: DateComponents(year: 2017, month: 7, day: 1, hour: 3, minute: 0, second: 0))! 

let date = Calendar.current.date(bySettingHour: 4, minute: 0, second: 0, of: 
date3am, direction: .backward)! 

date // "Jul 1, 2017, 4:00 AM" 
date < date3am // false 

爲什麼date(bySettingHour)不倒退?

+0

目前尚不清楚您要實現的目標。我認爲你有一個任意的日期(例如'date3am'),並且你試圖在同一天的04:00獲得日期,那是對的嗎? – paulvs

+0

'Calendar.current.date(bySettingHour:4,minute:0,second:0,of: date3am,direction:.backward)''*不*從* date3am開始加減4小時 - 即使它看起來好像*就像它應該做的那樣。它返回一個代表相同*日曆*日的新日期對象,並帶有新的**時間** - 因此,「7月1日凌晨4點」的結果*是正確的。 – DonMag

+0

@DonMag:我不想減去4小時,我想把時間設定爲4點。但我不想去下一個凌晨4點,而是回到前一個(如果是從0:00-3:59運行,那將是1天前) –

回答

2

您正在使用錯誤的方法。您需要使用日曆方法nextDate(after date:),如下所示:

let date3am = Calendar.current.date(from: DateComponents(year: 2017, month: 7, day: 1, hour: 3, minute: 0, second: 0))! 

if let date = Calendar.current.nextDate(after: date3am, matching: DateComponents(hour: 4, minute: 0, second: 0), matchingPolicy: .nextTime, repeatedTimePolicy: .first, direction: .backward) { 
    date // "Jun 30, 2017, 4:00 AM" 
    date < date3am // true 
} 
+0

謝謝! 'bySettingHour'方法似乎與枚舉方法具有相同的參數 - 但主要區別似乎是'nextDate'能夠倒退。 –

+0

@JasonMoore歡迎光臨 –

相關問題