如何提取自 Swift 中的日期以来的年数、月数和天数

How can I extract number of years, months, and days since a date in Swift

如何提取自 Swift.

中的日期以来的年数、月数和天数

到目前为止,我在名为 DatePickerController.

的 class 文件中有以下代码
class DatePickerController: UIViewController {

    @IBOutlet var datePicker:UIDatePicker!
    @IBOutlet var dateDisplay: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func datePickerChanged(sender: AnyObject) {
        setDate()
    }

    let dateFormatter = NSDateFormatter()

    // MARK: - Date Format
    func setDate() {
        dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
        dateDisplay.text = dateFormatter.stringFromDate(datePicker.date)
    }

}

我会为年、月、日创建单独的 UILables

您可以使用 NSCalendar 获取两个日期之间的 NSDateComponents。在 Swift 3:

let components = Calendar.current.dateComponents([.day, .month, .year], from: date1, to: date2)
let dayString = "\(components.day!)"
let monthString = "\(components.month!)"
let yearString = "\(components.year!)"

或在Swift 2:

let components = NSCalendar.currentCalendar().components([.Day, .Month, .Year], fromDate: date1, toDate: date2, options: [])
let dayString = "\(components.day)"
let monthString = "\(components.month)"
let yearString = "\(components.year)"

也许更简单,如果你想用一个字符串表示这两个日期之间经过的时间,你可以使用 NSDateComponentsFormatter,例如 Swift 3:

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.day, .month, .year]
formatter.unitsStyle = .full
let string = formatter.string(from: date1, to: date2)

或在Swift 2:

let formatter = NSDateComponentsFormatter()
formatter.allowedUnits = [.Day, .Month, .Year]
formatter.unitsStyle = .Full
let string = formatter.stringFromDate(date1, toDate: date2)

这个字符串也是本地化的。

您可以使用 NSDateComponents 通过 NSCalender

的方法 components(fromDate: toDate: options:) 检索年月日

示例

let date = NSDate(timeIntervalSinceNow: -123123123)

extension NSDate {
    func intereval(date:NSDate) -> (year: Int, month:Int, day:Int) {
        let calender = NSCalendar.currentCalendar()

       let components = calender.components([.Year, .Month, .Day], fromDate: date, toDate: self, options:.MatchStrictly)
        return (components.year, components.month, components.day)
    }
}

let component = NSDate().intereval(date)

print(component.year)
print(component.month)
print(component.day)

如您所说,每个日期组件都需要 UILabel。然后,您可以使用自定义日期格式字符串而不是使用 NSDateFormatterStye.ShortStyle 来提取组件。这为您提供了最大的灵活性。格式字符串遵循 unicode standard.

我无法在您的项目上下文中测试代码,但如果您添加标签并将它们正确连接到 Xcode,我相信这段代码将完全符合您的要求:

class DatePickerController: UIViewController {

  @IBOutlet var datePicker:UIDatePicker!
  @IBOutlet var dayDisplay: UILabel!
  @IBOutlet var monthDisplay: UILabel!
  @IBOutlet var yearDisplay: UILabel!

  override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }

  @IBAction func datePickerChanged(sender: AnyObject) {
    setDate()
  }

  let dateFormatter = NSDateFormatter()

  // MARK: - Date Format
  func setDate() {
    dateFormatter.dateFormat = "dd"
    dayDisplay.text = dateFormatter.stringFromDate(datePicker.date)
    dateFormatter.dateFormat = "MM"
    monthDisplay.text = dateFormatter.stringFromDate(datePicker.date)
    dateFormatter.dateFormat = "yyyy"
    yearDisplay.text = dateFormatter.stringFromDate(datePicker.date)
  }

}
import Foundation

let now = NSDate()
now.description.characters.split {
    " -".characters.contains([=10=])
}.enumerate().forEach {
    print([=10=].0,String([=10=].1))
}
/*
0 2015
1 12
2 26
3 19:34:33
4 +0000
*/