迄今为止的数量 - Swift

Number to Date - Swift

获取一年中的第几天很简单,例如

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

但是反过来怎么办呢?显然 return 只是 day/month。我可以轻松编写繁琐的反算例程,但有什么聪明的方法吗?

是的,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)

根据文档,

When there are insufficient components provided to completely specify an absolute time, a calendar uses default values of its choice. When there is inconsistent information, a calendar may ignore some of the components parameters or the method may return nil. Unnecessary components are ignored (for example, Day takes precedence over Weekday and Weekday ordinals).

此外,

Note that some computations can take a relatively long time to perform.

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

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"