Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get firstdate, lastdate of month?

Tags:

xcode

ios

nsdate

I want to get firstdate、lastdate of month,I try

NSDateComponents *components = [calendar components:units fromDate:[NSDate date]];
[components setDay:1];
self.currentDate = [calendar dateFromComponents:components];
int m = components.month;
int y = components.year;
int d = components.day;

log: 2012,5,1

How can i get lastdate od month?

please give me some advice,thank you!!

like image 808
Alice Chen Avatar asked May 23 '12 09:05

Alice Chen


People also ask

How do I find the first and last date of the month?

In this approach, we can make use of different methods to find out the first and last date of the month. The getDate() method is used for the specified date, that returns the day of the month (from 1 to 31). This method returns the day of the month which is represented by a number between 1 and 31.

How do I get the first date of the month in SQL?

To find the first day, the date time is first converted to date only using TO_DATE function. Then, the date is changed to the first day of the month by using the DATE_FROM_PARTS function. This works by inputting 01' in the 'day' part of the function.

How do I get last day of last month in SQL?

The LAST_DAY() function extracts the last day of the month for a given date.


2 Answers

Some NSDate category methods I wrote will help you:

Here's an easy way to find the start of a month:

 (NSDate *) startOfMonth
{
    NSCalendar * calendar = [NSCalendar currentCalendar];

    NSDateComponents * currentDateComponents = [calendar components: NSYearCalendarUnit | NSMonthCalendarUnit fromDate: self];
    NSDate * startOfMonth = [calendar dateFromComponents: currentDateComponents];

    return startOfMonth;
}

All it does is take the year and month components from the current day, then convert back to a date again.

For the end of the month, I use a couple of methods:

- (NSDate *) dateByAddingMonths: (NSInteger) monthsToAdd
{
    NSCalendar * calendar = [NSCalendar currentCalendar];

    NSDateComponents * months = [[NSDateComponents alloc] init];
    [months setMonth: monthsToAdd];

    return [calendar dateByAddingComponents: months toDate: self options: 0];
}

and

- (NSDate *) endOfMonth
{
    NSCalendar * calendar = [NSCalendar currentCalendar];

    NSDate * plusOneMonthDate = [self dateByAddingMonths: 1];
    NSDateComponents * plusOneMonthDateComponents = [calendar components: NSYearCalendarUnit | NSMonthCalendarUnit fromDate: plusOneMonthDate];
    NSDate * endOfMonth = [[calendar dateFromComponents: plusOneMonthDateComponents] dateByAddingTimeInterval: -1]; // One second before the start of next month

    return endOfMonth;
}

This is a 3 step process - add one month to the current date, find the start of the next month, then subtract 1 second to find the end of this month.


Swift 3

extension Date {

    func startOfMonth() -> Date? {

        let calendar = Calendar.current
        let currentDateComponents = calendar.dateComponents([.year, .month], from: self)
        let startOfMonth = calendar.date(from: currentDateComponents)

        return startOfMonth
    }

    func dateByAddingMonths(_ monthsToAdd: Int) -> Date? {

        let calendar = Calendar.current
        var months = DateComponents()
        months.month = monthsToAdd

        return calendar.date(byAdding: months, to: self)
    }

    func endOfMonth() -> Date? {

        guard let plusOneMonthDate = dateByAddingMonths(1) else { return nil }

        let calendar = Calendar.current
        let plusOneMonthDateComponents = calendar.dateComponents([.year, .month], from: plusOneMonthDate)
        let endOfMonth = calendar.date(from: plusOneMonthDateComponents)?.addingTimeInterval(-1)

        return endOfMonth

    }
}

Swift 2

extension NSDate {

    func startOfMonth() -> NSDate? {

        let calendar = NSCalendar.currentCalendar()
        let currentDateComponents = calendar.components(.CalendarUnitYear | .CalendarUnitMonth, fromDate: self)
        let startOfMonth = calendar.dateFromComponents(currentDateComponents)

        return startOfMonth
    }

    func dateByAddingMonths(monthsToAdd: Int) -> NSDate? {

        let calendar = NSCalendar.currentCalendar()
        let months = NSDateComponents()
        months.month = monthsToAdd

        return calendar.dateByAddingComponents(months, toDate: self, options: nil)
    }

    func endOfMonth() -> NSDate? {

        let calendar = NSCalendar.currentCalendar()
        if let plusOneMonthDate = dateByAddingMonths(1) {
            let plusOneMonthDateComponents = calendar.components(.CalendarUnitYear | .CalendarUnitMonth, fromDate: plusOneMonthDate)

            let endOfMonth = calendar.dateFromComponents(plusOneMonthDateComponents)?.dateByAddingTimeInterval(-1)

            return endOfMonth
        }

        return nil
    }
}
like image 85
Ashley Mills Avatar answered Oct 28 '22 15:10

Ashley Mills


Try this trick.

Day Param: 1 is to Get first date of this month

Day Param: 0 is to Get last date of this month by getting last date of month previous to next month (means this month))

- (void)returnDate:(NSDate *)date {

    NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit;
    NSDateComponents *comps = [calendar components:unitFlags fromDate:date];

    NSDate * firstDateOfMonth = [self returnDateForMonth:comps.month year:comps.year day:1];
    NSDate * lastDateOfMonth = [self returnDateForMonth:comps.month+1 year:comps.year day:0];

    NSLog(@"date %@", date);              // date 2013-06-20
    NSLog(@"First %@", firstDateOfMonth); // firstDateOfMonth 2013-06-01
    NSLog(@"Last %@", lastDateOfMonth);   // lastDateOfMonth  2013-06-30

}

Next

- (NSDate *)returnDateForMonth:(NSInteger)month year:(NSInteger)year day:(NSInteger)day {

    NSDateComponents *components = [[NSDateComponents alloc] init];

    [components setDay:day];
    [components setMonth:month];
    [components setYear:year];

    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    return [gregorian dateFromComponents:components];
}

Don't forget for right Date Formater

Updated for IOS 8.0

- (void)returnDate:(NSDate *)date { 
    NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth;
    NSDateComponents *comps = [calendar components:unitFlags fromDate:date];

    NSDate * firstDateOfMonth = [self returnDateForMonth:comps.month year:comps.year day:1];
    NSDate * lastDateOfMonth = [self returnDateForMonth:comps.month+1 year:comps.year day:0];

    NSLog(@"date %@", date);              // date 2013-06-20
    NSLog(@"First %@", firstDateOfMonth); // firstDateOfMonth 2013-06-01
    NSLog(@"Last %@", lastDateOfMonth);   // lastDateOfMonth  2013-06-30

}

Next

- (NSDate *)returnDateForMonth:(NSInteger)month year:(NSInteger)year day:(NSInteger)day {

    NSDateComponents *components = [[NSDateComponents alloc] init];

    [components setDay:day];
    [components setMonth:month];
    [components setYear:year];

    NSCalendar *gregorian = [[NSCalendar alloc]
                         initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    return [gregorian dateFromComponents:components];
}

Now your are working with:

  • NSCalendarUnitYear
  • NSCalendarUnitWeekOfMonth
  • NSCalendarIdentifierGregorian
like image 34
Nazir Avatar answered Oct 28 '22 16:10

Nazir