如何获取当月的开始date和结束date(Swift 3)

我试图以dd/MM/yyyy格式获取当前月份的开始date和结束date。 我尝试使用扩展在这个问题的答案。但它似乎不是我想要的(格式是不同的,它也给了我上个月的最后一个date和当前月最后一个date)。 有人能帮我吗。

扩展类:

 extension Date { func startOfMonth() -> Date? { let comp: DateComponents = Calendar.current.dateComponents([.year, .month, .hour], from: Calendar.current.startOfDay(for: self)) return Calendar.current.date(from: comp)! } func endOfMonth() -> Date? { var comp: DateComponents = Calendar.current.dateComponents([.month, .day, .hour], from: Calendar.current.startOfDay(for: self)) comp.month = 1 comp.day = -1 return Calendar.current.date(byAdding: comp, to: self.startOfMonth()!) } } 

我的结构:

 struct Constants{ // keys required for making a Login call (POST Method) struct LoginKeys { ..... } struct RankingKeys { static let DateFrom = String(describing: Date().startOfMonth()) //giving me 2016-11-30 16:00:00 +0000 static let DateTo = String(describing: Date().endOfMonth()) //2016-12-30 16:00:00 +0000 } } 

预期结果:

 DateFrom = "01/12/2016" DateTo = "31/12/2016" 

你应该写这个简单的代码:

 let dateFormatter = DateFormatter() let date = Date() dateFormatter.dateFormat = "dd-MM-yyyy" 

开始date:

 let comp: DateComponents = Calendar.current.dateComponents([.year, .month], from: date) let startOfMonth = Calendar.current.date(from: comp)! print(dateFormatter.string(from: startOfMonth)) 

结束date:

 var comps2 = DateComponents() comps2.month = 1 comps2.day = -1 let endOfMonth = Calendar.current.date(byAdding: comps2, to: startOfMonth) print(dateFormatter.string(from: endOfMonth!)) 

这是我正在使用的。 很简单,但它的作品。

 extension Calendar { func dayOfWeek(_ date: Date) -> Int { var dayOfWeek = self.component(.weekday, from: date) + 1 - self.firstWeekday if dayOfWeek <= 0 { dayOfWeek += 7 } return dayOfWeek } func startOfWeek(_ date: Date) -> Date { return self.date(byAdding: DateComponents(day: -self.dayOfWeek(date) + 1), to: date)! } func endOfWeek(_ date: Date) -> Date { return self.date(byAdding: DateComponents(day: 6), to: self.startOfWeek(date))! } func startOfMonth(_ date: Date) -> Date { return self.date(from: self.dateComponents([.year, .month], from: date))! } func endOfMonth(_ date: Date) -> Date { return self.date(byAdding: DateComponents(month: 1, day: -1), to: self.startOfMonth(date))! } func startOfQuarter(_ date: Date) -> Date { let quarter = (self.component(.month, from: date) - 1) / 3 + 1 return self.date(from: DateComponents(year: self.component(.year, from: date), month: (quarter - 1) * 3 + 1))! } func endOfQuarter(_ date: Date) -> Date { return self.date(byAdding: DateComponents(month: 3, day: -1), to: self.startOfQuarter(date))! } func startOfYear(_ date: Date) -> Date { return self.date(from: self.dateComponents([.year], from: date))! } func endOfYear(_ date: Date) -> Date { return self.date(from: DateComponents(year: self.component(.year, from: date), month: 12, day: 31))! } } 

使用Swift 3和iOS 10,我发现最简单的方法是使用CalendardateInterval(of:for:)

 guard let interval = calendar.dateInterval(of: .month, for: Date()) else { return } 

然后使用date格式化程序打印date:

 let formatter = DateFormatter() formatter.dateFormat = "dd-MM-yyyy" let dateText = formatter.string(from: interval.start) 

此扩展为您提供期望的输出

我在这里回到date

 extension NSDate { func startOfMonth() -> NSDate? { guard let cal: NSCalendar = NSCalendar.currentCalendar(), let comp: NSDateComponents = cal.components([.Year, .Month], fromDate: self) else { return nil } comp.to12pm() let dateformattor = NSDateFormatter() dateformattor.dateFormat = "yyyy-MM-dd" dateformattor.timeZone = NSTimeZone.localTimeZone() let dt2 = dateformattor.stringFromDate(cal.dateFromComponents(comp)!) print(dt2) dateformattor.dateFormat = "yyyy-MM-dd" dateformattor.timeZone = NSTimeZone.init(abbreviation: "UTC") return dateformattor.dateFromString(dt2) } func endOfMonth() -> NSDate? { guard let cal: NSCalendar = NSCalendar.currentCalendar(), let comp: NSDateComponents = NSDateComponents() else { return nil } comp.month = 1 comp.day = -1 comp.to12pm() let dateformattor = NSDateFormatter() dateformattor.dateFormat = "yyyy-MM-dd" dateformattor.timeZone = NSTimeZone.localTimeZone() let dt2 = dateformattor.stringFromDate(cal.dateByAddingComponents(comp, toDate: self.startOfMonth()!, options: [])!) dateformattor.dateFormat = "yyyy-MM-dd" dateformattor.timeZone = NSTimeZone.init(abbreviation: "UTC") return dateformattor.dateFromString(dt2) } } internal extension NSDateComponents { func to12pm() { self.hour = 12 self.minute = 0 self.second = 0 } } 

**输出: – **

 Start Date of Month :- 2016-12-01 00:00:00 +0000 End Date of Month :- 2016-12-31 00:00:00 +0000