나는 Swift의 두 NSDates / “새로운”Cocoa 사이에 일의 양을 얻을 수있는 새롭고 멋진 가능성이 있는지 궁금합니다.
예를 들어 Ruby에서와 같이 할 것입니다.
(end_date - start_date).to_i
답변
시차도 고려해야합니다. 예를 들어 날짜 2015-01-01 10:00
와 를 비교하면 2015-01-02 09:00
해당 날짜 간의 차이가 24 시간 미만 (23 시간)이므로 해당 날짜 사이의 날짜는 0 (영)으로 반환됩니다.
두 날짜 사이의 정확한 날짜를 확인하는 것이 목적이라면 다음과 같이이 문제를 해결할 수 있습니다.
// Assuming that firstDate and secondDate are defined
// ...
let calendar = NSCalendar.currentCalendar()
// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDayForDate(firstDate)
let date2 = calendar.startOfDayForDate(secondDate)
let flags = NSCalendarUnit.Day
let components = calendar.components(flags, fromDate: date1, toDate: date2, options: [])
components.day // This will return the number of day(s) between dates
Swift 3 및 Swift 4 버전
let calendar = Calendar.current
// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDay(for: firstDate)
let date2 = calendar.startOfDay(for: secondDate)
let components = calendar.dateComponents([.day], from: date1, to: date2)
답변
Swift 2에 대한 제 대답은 다음과 같습니다.
func daysBetweenDates(startDate: NSDate, endDate: NSDate) -> Int
{
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: [])
return components.day
}
답변
몇 가지 Swift3 답변이 표시되므로 직접 추가하겠습니다.
public static func daysBetween(start: Date, end: Date) -> Int {
Calendar.current.dateComponents([.day], from: start, to: end).day!
}
명명은 더 신속하고 한 줄이며 최신 dateComponents()
방법을 사용합니다 .
답변
Objective-C 답변을 번역했습니다.
let start = "2010-09-01"
let end = "2010-09-05"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let startDate:NSDate = dateFormatter.dateFromString(start)
let endDate:NSDate = dateFormatter.dateFromString(end)
let cal = NSCalendar.currentCalendar()
let unit:NSCalendarUnit = .Day
let components = cal.components(unit, fromDate: startDate, toDate: endDate, options: nil)
println(components)
결과
<NSDateComponents: 0x10280a8a0>
Day: 4
가장 어려운 부분은 자동 완성이 fromDate 및 toDate가라고 주장하는 NSDate?
것이지만 실제로 NSDate!
참조에 표시된 것과 같아야합니다 .
각 경우에 단위를 다르게 지정하고 싶기 때문에 연산자를 사용한 좋은 솔루션이 어떻게 보일지 모르겠습니다. 시간 간격을 반환 할 수는 있지만 많은 것을 얻지 못할 것입니다.
답변
Date
년, 월, 일, 시간, 분, 초의 날짜 차이를 얻는 매우 멋진 확장입니다.
extension Date {
func years(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.year], from: sinceDate, to: self).year
}
func months(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.month], from: sinceDate, to: self).month
}
func days(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.day], from: sinceDate, to: self).day
}
func hours(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.hour], from: sinceDate, to: self).hour
}
func minutes(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.minute], from: sinceDate, to: self).minute
}
func seconds(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.second], from: sinceDate, to: self).second
}
}
답변
Swift 3 iOS 10 Beta 4 업데이트
func daysBetweenDates(startDate: Date, endDate: Date) -> Int {
let calendar = Calendar.current
let components = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)
return components.day!
}
답변
다음은 Swift 3에 대한 답변입니다 (IOS 10 베타 테스트 완료)
func daysBetweenDates(startDate: Date, endDate: Date) -> Int
{
let calendar = Calendar.current
let components = calendar.components([.day], from: startDate, to: endDate, options: [])
return components.day!
}
그러면 이렇게 부를 수 있습니다
let pickedDate: Date = sender.date
let NumOfDays: Int = daysBetweenDates(startDate: pickedDate, endDate: Date())
print("Num of Days: \(NumOfDays)")