The first and last day of the current month in fast

I try to get the first and last day of the month in fast.

So far I have the following:

let dateFormatter = NSDateFormatter() let date = NSDate() dateFormatter.dateFormat = "yyyy-MM-dd" let calendar = NSCalendar.currentCalendar() let components = calendar.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: date) let month = components.month let year = components.year let startOfMonth = ("\(year)-\(month)-01") 

But I'm not sure how to get the latest date. Is there a built-in method that I am missing? Obviously, it should take into account leap years, etc.

+20
ios swift nsdate nscalendar
Nov 09 '15 at 9:17
source share
7 answers

You get the first day of the month just with

 let components = calendar.components([.Year, .Month], fromDate: date) let startOfMonth = calendar.dateFromComponents(components)! print(dateFormatter.stringFromDate(startOfMonth)) // 2015-11-01 

To get the last day of the month, add one month and subtract one day:

 let comps2 = NSDateComponents() comps2.month = 1 comps2.day = -1 let endOfMonth = calendar.dateByAddingComponents(comps2, toDate: startOfMonth, options: [])! print(dateFormatter.stringFromDate(endOfMonth)) // 2015-11-30 

Alternatively, use the rangeOfUnit method, which gives you the beginning and duration of the month:

 var startOfMonth : NSDate? var lengthOfMonth : NSTimeInterval = 0 calendar.rangeOfUnit(.Month, startDate: &startOfMonth, interval: &lengthOfMonth, forDate: date) 

For a date on the last day of the month, add the length of the month minus one second:

 let endOfMonth = startOfMonth!.dateByAddingTimeInterval(lengthOfMonth - 1) 
+39
Nov 09 '15 at 9:44
source share

Swift 3

This greatly facilitates working with Swift 3:

  • You can do this without protection (you could if you want, but since DateComponents is no longer an optional type, it is no longer needed)
  • Using iOS 8 startOfDayForDate (now startOfDay ), you don’t have to manually set the time until 12pm unless you are doing really crazy calendar calculations in time clocks.

Here you go:

 extension Date { func startOfMonth() -> Date { return Calendar.current.date(from: Calendar.current.dateComponents([.year, .month, .day], from: Calendar.current.startOfDay(for: self)))! } func endOfMonth() -> Date { return Calendar.current.date(byAdding: DateComponents(month: 1, day: -1), to: self.startOfMonth())! } } print(Date().startOfMonth()) // "2016-09-01 07:00:00 +0000\n" print(Date().endOfMonth()) // "2016-09-30 07:00:00 +0000\n" 
+51
Jan 26 '16 at 18:39
source share

With Swift 3 and iOS 10, the easiest way I found for this is Calendar dateInterval(of:for:) :

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

Then you can use interval.start and interval.end to get the dates you need.

+13
May 09 '17 at 1:32
source share

Swift 3

Many examples of dates for:

Last 6 months , last 3 months , yesterday, last 7 days, last 30 days, previous month, beginning and end of the current month, start and end date of the last month

 let startDate = dateFormatter.string(from: Date().getThisMonthStart()!) let endDate = dateFormatter.string(from: Date().getThisMonthEnd()!) extension Date { func getLast6Month() -> Date? { return Calendar.current.date(byAdding: .month, value: -6, to: self) } func getLast3Month() -> Date? { return Calendar.current.date(byAdding: .month, value: -3, to: self) } func getYesterday() -> Date? { return Calendar.current.date(byAdding: .day, value: -1, to: self) } func getLast7Day() -> Date? { return Calendar.current.date(byAdding: .day, value: -7, to: self) } func getLast30Day() -> Date? { return Calendar.current.date(byAdding: .day, value: -30, to: self) } func getPreviousMonth() -> Date? { return Calendar.current.date(byAdding: .month, value: -1, to: self) } // This Month Start func getThisMonthStart() -> Date? { let components = Calendar.current.dateComponents([.year, .month], from: self) return Calendar.current.date(from: components)! } func getThisMonthEnd() -> Date? { let components:NSDateComponents = Calendar.current.dateComponents([.year, .month], from: self) as NSDateComponents components.month += 1 components.day = 1 components.day -= 1 return Calendar.current.date(from: components as DateComponents)! } //Last Month Start func getLastMonthStart() -> Date? { let components:NSDateComponents = Calendar.current.dateComponents([.year, .month], from: self) as NSDateComponents components.month -= 1 return Calendar.current.date(from: components as DateComponents)! } //Last Month End func getLastMonthEnd() -> Date? { let components:NSDateComponents = Calendar.current.dateComponents([.year, .month], from: self) as NSDateComponents components.day = 1 components.day -= 1 return Calendar.current.date(from: components as DateComponents)! } } 
+6
Jul 19 '17 at 10:49 on
source share

2017 ...

First find the month you need:

  let cal = Calendar.current let d = Calendar.current.date(byAdding: .month, value: 0, to: Date())! // for "last month" just use -1, for "next month" just use 1, etc 

To get the day of the week on the first day of the month:

  let c = cal.dateComponents([.year, .month], from: d) let FDOM = cal.date(from: c)! let dowFDOM = cal.component(.weekday, from: FDOM) print("the day-of-week on the 1st is ... \(dowFDOM)") // so, that 1=Sunday, 2=Monday, etc. 

To get the number of days in a month:

  let r = cal.range(of: .day, in: .month, for: d)! let kDays = r.count print("the number of days is ... \(kDays)") 
+4
Jul 17 '17 at 17:32
source share

With Swift 3, you can select one of the following two templates to get the first and last days of the month.




# 1. Using Calendar dateComponents(_:from:) , date(from:) and date(byAdding:to:wrappingComponents:) methods

Using this template, you first get the date of the first day of the month, then add the month and remove the day from it to get the date of the last day of the month. Below is the code below than below.

 import Foundation // Set calendar and date let calendar = Calendar.current let date = calendar.date(byAdding: DateComponents(day: -10), to: Date())! // Get first day of month let firstDayComponents = calendar.dateComponents([.year, .month], from: date) let firstDay = calendar.date(from: firstDayComponents)! // Get last day of month let lastDayComponents = DateComponents(month: 1, day: -1) let lastDay = calendar.date(byAdding: lastDayComponents, to: firstDay)! // Set date formatter let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_UK") dateFormatter.dateStyle = .long dateFormatter.timeStyle = .long // Print results print(dateFormatter.string(from: date)) // Prints: 22 March 2017 at 18:07:15 CET print(dateFormatter.string(from: firstDay)) // Prints: 1 March 2017 at 00:00:00 CET print(dateFormatter.string(from: lastDay)) // Prints: 31 March 2017 at 00:00:00 CEST 



# 2. Using Calendar range(of:in:for:) , dateComponents(_:from:) and date(from:) and methods

Using this template, you get the range of absolute day per month, and then extract the dates of the first day and last day of the month from it. Below is the code below than below.

 import Foundation // Set calendar and date let calendar = Calendar.current let date = calendar.date(byAdding: DateComponents(day: -10), to: Date())! // Get range of days in month let range = calendar.range(of: .day, in: .month, for: date)! // Range(1..<32) // Get first day of month var firstDayComponents = calendar.dateComponents([.year, .month], from: date) firstDayComponents.day = range.lowerBound let firstDay = calendar.date(from: firstDayComponents)! // Get last day of month var lastDayComponents = calendar.dateComponents([.year, .month], from: date) lastDayComponents.day = range.upperBound - 1 //lastDayComponents.day = range.count // also works let lastDay = calendar.date(from: lastDayComponents)! // Set date formatter let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_UK") dateFormatter.dateStyle = .long dateFormatter.timeStyle = .long // Print results print(dateFormatter.string(from: date)) // prints: 22 March 2017 at 18:07:15 CET print(dateFormatter.string(from: firstDay)) // prints: 1 March 2017 at 00:00:00 CET print(dateFormatter.string(from: lastDay)) // prints: 31 March 2017 at 00:00:00 CEST 
+1
Apr 01 '17 at 18:30
source share

In fast 3, if you put a 0-day component, you can get the last day of the month. Here is a sample code:

  public func isMoreDays(date: Date, asc: Bool)->Bool{ //components var dayComponents = self.getDateComponents(date: date) //asc is true if ascendant or false if descendant dayComponents.day = asc ? 0 : 1 //plus 1 to month 'cos if you set up day to 0 you are going to the previous month dayComponents.month = asc ? dayComponents.month! + 1 : dayComponents.month //instantiate calendar and get the date let calendar : Calendar = NSCalendar.current let day = calendar.date(from: dayComponents) //date comparison if(day?.compare(date) == .orderedSame){ return false } return true } 
+1
Jun 21 '17 at 15:58
source share



All Articles