NSDate für den ersten Tag des Monats
-
03-10-2019 - |
Frage
Dies ist ein ganz einfaches Konzept, aber bisher habe ich es nicht gelungen, eine elegante (und Kalender locale unabhängig) Lösung zu finden. Ich brauche den ersten Tag des Monats für eine beliebige NSDate
zu finden. Zum Beispiel wird eine beliebige NSDate
(arbitraryDate
) ein anderes NSDate gegeben Objekt zurückgegeben (sie dieses firstDayOfMonthDate
nennen), die den ersten Tag des Monats in arbitraryDate
darstellt. Die Zeitkomponente spielt keine Rolle, wie ich nur das NSDate Objekt für den ersten Tag des Monats muß (obwohl für Ordentlichkeit wäre es nützlich, wenn die Zeit nur auf Null gesetzt wurde).
Vielen Dank im Voraus für jede Hilfe.
Lösung
Eine mögliche Lösung:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *arbitraryDate = [NSDate date];
NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:arbitraryDate];
[comp setDay:1];
NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp];
Andere Tipps
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear
fromDate:[NSDate date]];
components.day = 1;
NSDate *firstDayOfMonthDate = [[NSCalendar currentCalendar] dateFromComponents: components];
NSLog(@"First day of month: %@", [firstDayOfMonthDate descriptionWithLocale:[NSLocale currentLocale]]);
Swift 3
I've included getting the last day of the month in case it is useful to anyone.
extension Date {
func lastDayOfMonth() -> Date {
let calendar = Calendar.current
let dayRange = calendar.range(of: .day, in: .month, for: self)
let dayCount = dayRange!.count
var comp = calendar.dateComponents([.year, .month, .day], from: self)
comp.day = dayCount
return calendar.date(from: comp)!
}
func firstDayOfMonth() -> Date {
let calendar: Calendar = Calendar.current
var components: DateComponents = calendar.dateComponents([.year, .month, .day], from: self)
components.setValue(1, for: .day)
return calendar.date(from: components)!
}
}
Swift version
let arbitraryDate:NSDate = NSDate()
let calendar:NSCalendar = NSCalendar.currentCalendar()
let components:NSDateComponents = calendar.components([.Year, .Month, .Day], fromDate: arbitraryDate)
components.setValue(1, forComponent: .Day)
let firstDayOfMonthDate = calendar.dateFromComponents(components)
Swift 3:
let calendar = Calendar.current
var comps = calendar.dateComponents([.year, .month], from: date)
comps.setValue(1, for: .day)
let firstDayOfMonth = calendar.date(from: comps)!
// I tried this, but it doesn't work, why?
// let firstDayOfMonth = calendar.date(bySetting: .day, value: 1, of: date)!