从NSCalendar.dateFromComponents获取奇怪的日期

时间:2016-09-19 14:20:38

标签: swift nscalendar nsdatecomponents weekday

我正在尝试从component year weekdayOfWeeklet calendar = NSCalendar(identifier: NSCalendarIdentifierISO8601) let components = NSDateComponents() components.weekday = 1 components.weekOfYear = 16 components.yearForWeekOfYear = 2016 let dateKW = calendar?.dateFromComponents(components) 获取约会,但我从上面得到了奇怪的约会提到的功能。这是我的工作:

weekday

变量dateKW等于24。2016年4月。当我将import UIKit class RestaurantTableViewController: UITableViewController { var restaurants:[Resturant] = [ Resturant(name: "Hardees", type: "Burger", location: "Many", image: "Hardees.jpg", isVisited: false), Resturant(name: "Shake Shack", type: "Burger", location: "Gulf Mall", image: "shakeshack.jpg", isVisited: false), Resturant(name: "Burgery", type: "Burger", location: "Gulf Mall", image: "shakeshack.jpg", isVisited: false), Resturant(name: "Dairy Queen", type: "Burger", location: "Gulf Mall", image: "shakeshack.jpg", isVisited: false), Resturant(name: "Elevation Burger", type: "Burger", location: "Gulf Mall", image: "shakeshack.jpg", isVisited: false), Resturant(name: "Fat Burger", type: "Burger", location: "Gulf Mall", image: "shakeshack.jpg", isVisited: false) ] override func viewDidLoad() { super.viewDidLoad() // Uncomment the following line to preserve selection between presentations // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return restaurants.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cellIdentifier = "Cell" let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! CustomTableViewCell // Configure the cell... cell.nameLabel.text = restaurants[indexPath.row].name cell.thumbnailImageView.image = UIImage(named: restaurants[indexPath.row].image) cell.locationLabel.text = restaurants[indexPath.row].location cell.typeLabel.text = restaurants[indexPath.row].type cell.accessoryType = restaurants[indexPath.row].isVisited ? .checkmark : .none return cell } override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { // Delete the row from the data source restaurants.remove(at: indexPath.row) } tableView.deleteRows(at: [indexPath], with: .fade) } override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { // Social Sharing Button let shareAction = UITableViewRowAction(style: UITableViewRowActionStyle.default, title: "Share", handler: { (action, indexPath) -> Void in let defaultText = "Just checking in at " + self.restaurants[indexPath.row].name if let imageToShare = UIImage(named: self.restaurants[indexPath.row].image) { let activityController = UIActivityViewController(activityItems: [defaultText, imageToShare], applicationActivities: nil) self.present(activityController, animated: true, completion: nil) } }) // Delete button let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.default, title: "Delete",handler: { (action, indexPath) -> Void in // Delete the row from the data source self.restaurants.remove(at: indexPath.row) self.tableView.deleteRows(at: [indexPath], with: .fade) }) shareAction.backgroundColor = UIColor(red: 48.0/255.0, green: 173.0/255.0, blue: 99.0/255.0, alpha: 1.0) deleteAction.backgroundColor = UIColor(red: 202.0/255.0, green: 202.0/255.0, blue: 203.0/255.0, alpha: 1.0) return [deleteAction, shareAction] } // MARK: - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showRestaurantDetail" { if let indexPath = tableView.indexPathForSelectedRow { let destinationController = segue.destination as! ResturantDetailViewController destinationController.resturant = restaurants[indexPath.row] } } } } 更改为2时,我得到2016年4月18日。为什么会这样?难道第一天不应该是2016年4月17日吗?

1 个答案:

答案 0 :(得分:3)

在公历中,工作日单位从1=Sunday2=Monday,...到7=Saturday不等。如果您所在区域的第一个工作日是星期一(例如在德国),那么第18个日历周 2016年4月18日(周一)至4月24日(周日)。

因此要求在第16周的星期天

components.weekday = 1
components.weekOfYear = 16
components.yearForWeekOfYear = 2016

正确返回2016年4月24日。如果您需要第一天 一周然后设置

components.weekday = calendar.firstWeekday

或根本不设置components.weekday