2012-05-23 9 views
16

Chcę dostać firstdate, ostatnią datę o miesiąc, staramOtrzymasz pierwszą datę, ostatnią datę miesiąca?

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 

Jak mogę dostać ostatnią datę od miesięcy?

proszę dać mi kilka porad, dziękuję !!

+0

Możesz utworzyć obiekt daty pierwszego dnia następnego miesiąca, a następnie odejmij kilka sekund od tej daty: '[date dateByAddingTimeInterval: -3600]' – Hejazi

Odpowiedz

1

można uzyskać ostatnią datę miesiąca przy użyciu: -

NSDate currDate=[NSDate date]; 

-(NSString *)getLastDateMonth:(NSDate *)currDate{ 

    NSCalendar *gregCalendar=[[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 

    NSDateComponents *components=[gregCalendar components:NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currDate]; 
    NSInteger month=[components month]; 
    NSInteger year=[components year]; 

    if (month==12) { 
    [components setYear:year+1]; 
    [components setMonth:1]; 
    } else { 
    [components setMonth:month+1]; 
    } 
    [components setDay:1]; 

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateStyle:NSDateFormatterShortStyle]; 
    NSString *lastDateOfMonth = [dateFormat stringFromDate:(NSDate *)[[gregCalendar dateFromComponents:components] dateByAddingTimeInterval:-86400]]; 
    dateFormat=nil; 
    return lastDateOfMonth; 
} 
27

Niektóre NSDate metody kategoria pisałem pomoże Ci:

Oto prosty sposób na znalezienie początek miesiąca:

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

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

    return startOfMonth; 
} 

Wystarczy, że pobierzesz komponenty roku i miesiąca z bieżącego dnia, a następnie ponownie powrócisz do daty.

Na koniec miesiąca, używam kilka metod:

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

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

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

i

- (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; 
} 

Jest to proces 3 krok - dodać jeden miesiąc do bieżącej daty, znaleźć początek następnego miesiąca, a następnie odejmij 1 sekundę, aby znaleźć koniec tego miesiąca.


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 
    } 
} 
+2

Jedną z rzeczy do dodania jest 'NSCalendar' ma właściwość' timeZone' która domyślnie jest ustawiona na bieżącą strefę czasową. Aby uzyskać te konwersje w GMT, powinieneś dodać '[calendar setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @" GMT "];' –

+0

Dodanie strefy czasowej GMT w Swift: calendar.timeZone = NSTimeZone (name: "GMT")! –

+0

Użycie: NSCalendarUnitYear i NSCalendarUnitMonth, aby uniknąć ostrzeżeń o przestarzałości – halbano

6

Spróbuj tej sztuczki.

Dzień Param: 1 jest, aby pierwszy dzień tego miesiąca

Dzień Param: 0 jest uzyskanie ostatniego dnia tego miesiąca przez coraz ostatnią datę miesiąca poprzedniego do następnego miesiąca (czyli w tym miesiącu))

- (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 

} 

Następny

- (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]; 
} 

nie zapomnij o odpowiednim Data formater

Zaktualizowano dla 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 

} 

Następny

- (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]; 
} 

teraz Twój pracują z:

  • NSCalendarUnitYear
  • NSCalendarUnitWeekOfMonth
  • NSCalendarIdentifierGregorian
+0

jego działanie nie jest takie samo, jak w przypadku ostatniej daty i daty pierwszej. trzeba zmienić, np. NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay jego daje doskonały wynik. – jenish

+0

@jenish dzięki, po aktualizacji do ios8, umieszczony niewłaściwy składnik - tydzień w miesiącu. Poprawne jest 'NSCalendarUnitMonth' zaktualizował odpowiedź. NSCalendarUnitDay nie trzeba umieszczać, ponieważ nie używamy go w następnym kodzie. – Nazir

+2

Otrzymuję poprzednią datę ... Bieżący miesiąc to luty, ale data pierwszej i ostatniej daty jest 31 stycznia i 27 lutego –

3

OK, ponieważ uruchamiam własny kontroler kalendarza, opracowałem kategorię NSCalendar. Oto mój lastOfMonth metoda:

- (NSDate *)lastOfMonth:(NSDate *)date 
{ 
    NSDateComponents *dc = [self components:NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit fromDate:date]; 

    NSRange dim = [self rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date]; 
    dc.day = dim.length; 

    return [self dateFromComponents:dc]; 
} 
2

Dla Swift 2.0 zdobyć pierwszy dzień bieżącego miesiąca:

let date = NSDate() 
    let calendar = NSCalendar.currentCalendar() 
    let dateComponents = calendar.components([NSCalendarUnit.Month, NSCalendarUnit.Year], fromDate: date) 
    let firstDay = self.returnDateForMonth(dateComponents.month, year: dateComponents.year, day: 1) 
    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "dd-MMM-yy" 

    print("First day of this month: \(firstDay)") // 01-Sep-15 

a funkcja to zrobić:

func returnDateForMonth(month:NSInteger, year:NSInteger, day:NSInteger)->NSDate{ 
    let comp = NSDateComponents() 
    comp.month = month 
    comp.year = year 
    comp.day = day 

    let grego = NSCalendar.currentCalendar() 
    return grego.dateFromComponents(comp)! 
} 
1

w Swift na podstawie odpowiedzi Nazira:

 func getFirstAndLastDateOfMonth(date: NSDate) -> (fistDateOfMonth: NSDate, lastDateOfMonth: NSDate) { 

      let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) 
      let calendarUnits = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth 
      let dateComponents = calendar?.components(calendarUnits, fromDate: date) 

      let fistDateOfMonth = self.returnedDateForMonth(dateComponents!.month, year: dateComponents!.year, day: 1) 
      let lastDateOfMonth = self.returnedDateForMonth(dateComponents!.month + 1, year: dateComponents!.year, day: 0) 

      println("fistDateOfMonth \(fistDateOfMonth)") 
      println("lastDateOfMonth \(lastDateOfMonth)") 

      return (fistDateOfMonth!,lastDateOfMonth!) 
     } 

     func returnedDateForMonth(month: NSInteger, year: NSInteger, day: NSInteger) -> NSDate? { 
      var components = NSDateComponents() 
      components.day = day 
      components.month = month 
      components.year = year 

      let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) 

      return gregorian!.dateFromComponents(components) 
     } 
0

Wygląda na to, nie ma potrzeby żadnych sztuczek lub hacków, NSCalendar „s rangeOfUnit spełnia swoje zadanie całkiem ładnie:

NSCalendar *cal = [NSCalendar currentCalendar]; 

NSDateComponents *dc = [[NSDateComponents alloc] init]; 
dc.year = 1947; 
dc.month = 8; //desired month 

//calculate start date 
dc.day = 1; //As far as I can think start date of a month will always be 1 
NSDate *start = [cal dateFromComponents:dc]; 

//calculate last date of month 
NSRange dim = [cal rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:start]; // we used start date as it has the same month & year value as desired 
dc.day=dim.length; //this is the simply the last day of the desired month 
NSDate *last = [[NSCalendar currentCalendar] dateFromComponents:dc]; 

Log wartości dla weryfikacji:

NSLog(@"Start day of month Date: %@", start); 
NSLog(@"Last day of month Date: %@", last); 

Jabłko dokumenty na temat NSCalendar rangeOfUnit: https://developer.apple.com/documentation/foundation/nscalendar/1418344-rangeofunit

ps wygląda na to, że używa tej samej logiki co @Scott Odpowiedź na to pytanie, ale nie wymaga żadnej kategorii, więc skorzystaj z odpowiedzi, którą wolisz!

Powiązane problemy