NSDate per il primo giorno del mese
-
03-10-2019 - |
Domanda
Questo è piuttosto un concetto semplice, ma fino ad ora sono stato in grado di trovare una soluzione elegante (e locale del calendario indipendente). Ho bisogno di trovare il primo giorno del mese per un NSDate
arbitrario. Ad esempio, dato un NSDate
arbitraria (arbitraryDate
) un altro oggetto NSDate verrà restituito (chiamiamolo questo firstDayOfMonthDate
), che rappresenta il primo giorno del mese in arbitraryDate
. La componente tempo non ha importanza, come ho solo bisogno l'oggetto NSDate per il primo giorno del mese (anche se per pulizia sarebbe utile se il tempo era appena azzerato).
Grazie in anticipo per qualsiasi tipo di assistenza.
Soluzione
Una possibile soluzione:
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];
Altri suggerimenti
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
Ho incluso ottenere l'ultimo giorno del mese nel caso in cui è utile a nessuno.
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)!
}
}
Versione Swift
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)!