2017-07-14 24 views
0

日付を指定すると、4:00に日付を取得したいと考えています。前日の日付@ 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)が後方に行かない:午前3時39分 - これは、午後12時00分のために失敗しますか?

+0

達成しようとしていることは明確ではありません。私はあなたが任意の日付(例えば 'date3am')を持っていて、その日の04:00に日付を取得しようとしていると思いますか? – paulvs

+0

Calendar.current.date(bySettingHour:4、分:0、秒:0、中: date3am、方向:.backward) 'date3am'から4時間を加算または減算しない - *そのようなやり方が必要です。同じ**カレンダー*日を表す新しいDateオブジェクトを新しい** Time **で返します。したがって、 "4月7日の午前4時" *の結果は正しいです。 – DonMag

+0

@DonMag:私は4時間を減算したくない、私は4時に時間を設定したい。しかし、私は次の午前4時に行きたくありませんが、前の時刻に戻る(1日前、0時00分から3時59分まで) –

答えて

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 u r welcome –

関連する問題