到目前为止的数字 - 斯威夫特

时间:2015-07-14 06:43:42

标签: swift nsdate nscalendar

获得一年中的某一天很简单,例如。

func dayOfYear(inputDate:NSDate) -> (Int) {
    let cal         = NSCalendar.currentCalendar()
    let returnDay   = cal.ordinalityOfUnit(.CalendarUnitDay, inUnit: .CalendarUnitYear, forDate: inputDate)
    return returnDay
}

但你怎么反过来呢?它显然只会返回日/月。我可以很容易地编写一个乏味的例程反算,但有一种聪明的方法吗?

2 个答案:

答案 0 :(得分:1)

是的,NSCalendar提供了一种将日历组件合并为单个日期对象的方法。看看我在Playground中写的这个例子:

import UIKit
import Foundation

let inputDate: NSDate = NSDate()
let calendar = NSCalendar.currentCalendar()
let day = calendar.ordinalityOfUnit(.CalendarUnitDay, inUnit: .CalendarUnitYear, forDate: inputDate)

let components = NSDateComponents()
components.day = day

let date = calendar.dateFromComponents(components)

根据文件,

  

如果提供的组件不足以完全指定绝对时间,则日历将使用其选择的默认值。当信息不一致时,日历可能会忽略某些组件参数,或者该方法可能返回nil。忽略不必要的组件(例如,Day优先于Weekday和Weekday序数)。

此外,

  

请注意,某些计算可能需要相对较长的时间才能执行。

有关详细信息,请参阅NSCalendar Class Reference

答案 1 :(得分:1)

func dayOfYear(inputDate: NSDate) -> Int {
    return NSCalendar.currentCalendar().ordinalityOfUnit(.CalendarUnitDay, inUnit: .CalendarUnitYear, forDate: inputDate)
}

func dateFromDayOfYear(day: Int) -> NSDate {
    return NSCalendar.currentCalendar().dateWithEra(1, year: NSCalendar.currentCalendar().component(.CalendarUnitYear, fromDate: NSDate()), month: 1, day: day, hour: 0, minute: 0, second: 0, nanosecond: 0)!
}

let numberOfDays = dayOfYear(NSDate())   // 195

dateFromDayOfYear(numberOfDays)    // "Jul 14, 2015, 12:00 AM"