2017-08-18 3 views
2

の結果を理解する際の問題連絡先の誕生日を含む連絡先のリストがあります。 今、私の連絡先のうち7日以内に誕生日があるのが見たいです。 私は私の希望はそうだったSwift私のアプリでCalendar.dateComponents

 let timeSpan = 7 
    let cal = Calendar.current 
    let now = Date() 
    var birthDays = contactList.filter { (contact) -> Bool in 
     if let birthDate = contact.birthDate { 
      let difference = cal.dateComponents([.day,.year], from: birthDate as Date, to: now!) 
      print("BD:\(birthDate) : DIFF \(difference.day!)") 
      return ((difference.day! <= timeSpan) && difference.day! >= 0) 
     } 
     return false 
    } 

一致のみTHOSの連絡先をフィルタリングして返すために私のリストにフィルタを使用しています。しかし、結果はうまくいった。だから私はその差異の結果を見るために閉口にその醜いプリントを追加しました

奇妙なことは、例えば次のようなものです: 今日は2017-08-18私の連絡先の1人が1987年に生まれました - 08-19。 したがって、1のdifference.dayを返す代わりに、私は364を受け取ります。私はfrom:とfrom:dateComponentsに私は-364のdifference.dayを受け取ります。

私の期待は、私が間違って何をやっているの遊び場

import UIKit 
var now = Date() 
let dateFormatter = DateFormatter() 

dateFormatter.dateFormat = "yyyy-MM-dd" 
let s = dateFormatter.date(from: "1987-08-19") 

let cal = Calendar.current 

let difference = cal.dateComponents([Calendar.Component.day,Calendar.Component.month,Calendar.Component.year], from: s!, to: now) 
print("\(difference.day!)") // result is difference.day = 30 

に再び= 1

difference.dayを持っていましたか?

おかげ

+0

申し訳ありませんが、しかしそれは役に立たなかった。今私はdifference.day = 29を受け取る –

+0

うーん、コメントはどこに行ったのですか? –

+0

ありがとう、両方の答えが働く。しかし私は@Leo Dabosを好む。私はそれにエレガンスが好きです:-) もう一度ありがとう –

答えて

1

extension Date { 
    var year: Int { return Calendar.current.component(.year, from: self) } 
    var month: Int { return Calendar.current.component(.month, from: self) } 
    var day: Int { return Calendar.current.component(.day, from: self) } 
    var noon: Date { return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)! } 
    var daysFromBirthday: Int { 
     let nextBirthDate = DateComponents(calendar: .current, year: Date().year + (month < Date().month ? 1 : 0), month: month, day: day, hour: 12).date ?? Date.distantFuture 
     return Calendar.current.dateComponents([.day], from: Date().noon, to: nextBirthDate).day ?? 0 
    } 
} 

そして、あなたは今、次のようにあなたのオブジェクトをフィルタすることができます

let timeSpan = 0...7 

let birthDays = contactList.filter { 
    timeSpan ~= $0.birthDate?.daysFromBirthday ?? -1 
} 
1

問題は、ユーザーの誕生日からの日数の違いを確認したが、アプリで私たちは、今年中に現在の日付と誕生日との差異を取得する必要がありますしました。あなたが言った例で言えば、それは2017-08-19(今年の誕生日)と2017-08-18(現在の日付)の違いです。以下のコードを試すことができます。

あなたは次のように次の誕生日からの日数を返すように拡張機能を作成することができます
var now = Date() 

dateFormatter.dateFormat = "yyyy-MM-dd" 
let s = dateFormatter.date(from: "1987-08-19") 

let cal = Calendar.current 

let currentDateComponentsYear = cal.dateComponents([.year,.month,.day], from: newDate!) 

var dateComponents = cal.dateComponents([.year,.month,.day], from: s!) 
dateComponents.year = currentDateComponentsYear.year 
let currentYearBDay = cal.date(from: dateComponents) 
currentDateComponentsYear.month 
let difference = cal.dateComponents([Calendar.Component.year,Calendar.Component.month,Calendar.Component.day], from:newDate! , to: currentYearBDay!) 
let daysDiffernce:Int? 
if dateComponents.month == 1 && currentDateComponentsYear.month == 12 && difference.day! < 0 { 
    let range = cal.range(of: .day, in: .month, for: newDate!)! 
    let numDays = range.count 
    daysDiffernce = difference.day! + numDays 

} else { 
    daysDiffernce = difference.day 
} 

print("\(daysDiffernce!)") //result 1