2017-03-14 17 views
0

我正在嘗試從Date對象數組中獲取最近的時間(小時和分鐘)到當前時間(小時和分鐘)。如何從日期數組中獲取當前時間的最近時間? iOS,Swift 3

我想要的不是比較和找到最接近的日期,而是時間(僅限於小時和分鐘)。有沒有任何iOS方式/ Swfit 3可以有效地做到這一點?

編輯: 最接近的時間是「前進」順時針,而不是向後看的時候。

EDIT2: 下面是一個示例:

import Foundation 

let userCalendar = Calendar.current 

var firstDateComponents = DateComponents() 
firstDateComponents.year = 2017 
firstDateComponents.month = 1 
firstDateComponents.day = 1 
firstDateComponents.hour = 23 
firstDateComponents.minute = 50 
let firstDate = userCalendar.date(from: firstDateComponents) 

var secondDateComponents = DateComponents() 
secondDateComponents.year = 2016 
secondDateComponents.month = 12 
secondDateComponents.day = 24 
secondDateComponents.hour = 23 
secondDateComponents.minute = 55 
let secondDate = userCalendar.date(from: secondDateComponents) 

var thirdDateComponents = DateComponents() 
thirdDateComponents.year = 2017 
thirdDateComponents.month = 3 
thirdDateComponents.day = 1 
thirdDateComponents.hour = 0 
thirdDateComponents.minute = 30 
let thirdDate = userCalendar.date(from: thirdDateComponents) 

var fourthDateComponents = DateComponents() 
fourthDateComponents.year = 2017 
fourthDateComponents.month = 3 
fourthDateComponents.day = 1 
fourthDateComponents.hour = 4 
fourthDateComponents.minute = 20 
let fourthDate = userCalendar.date(from: fourthDateComponents) 

var currentDateComponents = DateComponents() 
currentDateComponents.year = 2017 
currentDateComponents.month = 3 
currentDateComponents.day = 2 
currentDateComponents.hour = 0 
currentDateComponents.minute = 10 

let currentDate = userCalendar.date(from: currentDateComponents) 
let dates = [firstDate, secondDate, thirdDate, fourthDate] 

這個例子的預期的結果將是包含數據結構中心(12:30 AM),所述第三日期。

EDIT3: 好一會解決方案:

爲了獲取時間的組件和帶不相關的最新信息:

let dateComponentsFromDates = dates.map { date -> DateComponents in 
    let dateComponents = DateComponents(calendar: userCalendar, timeZone: nil, era: nil, year: nil, month: nil, day: nil, hour: userCalendar.component(.hour, from: date!), minute: userCalendar.component(.minute, from: date!), second: nil, nanosecond: nil, weekday: nil, weekdayOrdinal: nil, quarter: nil, weekOfMonth: nil, weekOfYear: nil, yearForWeekOfYear: nil) 
    return dateComponents 
} 
+2

我相信他們願意比較小時/分鐘,忽略日/月/年組件;即。如果現在是10:20,那麼週日的10:19比周二的9:20('今天')「接近」 – Paulw11

+1

'23:59'接近'0:01'還是'23:50'? – kennytm

+0

看來你必須比較日期和Swift 3比較日期是如此簡單,因爲它的可比較&等於 – abdullahselek

回答

1

你可以簡單的排序您基於它的日期列表的偏移從目前的時間,使用日曆和日期分量,我們可以確保我們只看看日期的小時和分鐘組件:

var dates = [Date]() 
// assume somehow this array is populated 
let cal = Calendar.current 
let nowComponents = cal.dateComponents([Calendar.Component.hour, Calendar.Component.minute], from: Date()) 
let nowMinsIntoDay = (nowComponents.hour ?? 0) * 60 + (nowComponents.minute ?? 0) 
// Create a new list of tuples including the date and the minutes from now 
let datesWithMinsFromNow = dates.map { (date) -> (Date, Int) in 
    let comp = cal.dateComponents([Calendar.Component.hour, Calendar.Component.minute], from: date) 
    let minsFromNow = (comp.hour ?? 0) * 60 + (comp.minute ?? 0) - nowMinsIntoDay 
    return (date, minsFromNow) 
} 
// Filter out any pairs that are earlier in the day than now 
let datesLaterThanNow = datesWithMinsFromNow.filter { return $0.1 >= 0 } 
// Sort the remaining items 
let sortedDates = datesLaterThanNow.sorted { $0.1 < $1.1 } 
// Take the first item 
let closest = sortedDates.first?.0 // closest should now be a `Date` object 
+0

這將比較日期,而不僅僅是時間。 –

+0

@GeorgeGreen謝謝。我希望我能更多地澄清我的問題。在最接近的時候,我的意思是說,如果我們有當前時間12:23 PM,它的陣列有6:48 AM,12:05 PM和4:01 AM,那麼最接近的時間是4:01 AM,所以最近的時間計算爲「前進」,而不是後退。 –

+0

@tommagellancook啊,所以你想要的是從現在開始在陣列中的「下一個」時間? –

0

如果當前時間更接近當前時間的毫秒,您可以將當前時間轉換爲毫秒並檢查每個日期。

那我怎麼會這麼做:

let dates = [Date]() 
let currentDate = Date() 
var closestMiliseconds = nowDate.currentTimeInMiliseconds() 
for date in dates { 
    if currentDate.currentTimeInMiliseconds() - date.currentTimeInMiliseconds() < closestMiliseconds { 
     closestMiliseconds = Int(date.currentTimeInMiliseconds()) 
    } 
} 

let closestDate = closestMiliseconds.dateFromMilliseconds() 

多數民衆贊成在currentTimeInMiliseconds()函數:

func currentTimeInMiliseconds() -> Int64 { 
    let since1970 = self.timeIntervalSince1970 
    return Int64(since1970 * 1000) 
} 

並且那是dateFromMilliseconds()函數:

func dateFromMilliseconds() -> Date { 
    return Date(timeIntervalSince1970: TimeInterval(self)/1000) 
} 
+0

謝謝你試圖解決這個問題。你可以在操作系統中運行你的代碼來處理來自問題的樣本數據,並且當前日期使用樣本中提供的currentDate?你的結果是什麼? –

+0

@tommagellancook我試過了。 我得到了最接近的日期,這是正確的嗎? – orim553

相關問題