Quel est le moyen le plus efficace d’obtenir un object NSDate représentant minuit du jour actuel?
Essaye ça:
NSDate *const date = NSDate.date; NSCalendar *const calendar = NSCalendar.currentCalendar; NSCalendarUnit const preservedComponents = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay); NSDateComponents *const components = [calendar components:preservedComponents fromDate:date]; NSDate *const normalizedDate = [calendar dateFromComponents:components];
Nouvelle API dans iOS 8
iOS 8 inclut une nouvelle méthode sur NSCalendar appelée startOfDayForDate , qui est très simple à utiliser:
let startOfToday = NSCalendar.currentCalendar().startOfDayForDate(NSDate())
Description d’Apple:
Cette API renvoie la date du premier moment d’une date donnée. Passez par [date de NSDate], par exemple, si vous voulez le début de “aujourd’hui”. S’il y avait deux midnights, il retourne le premier. S’il n’y en avait pas, il retourne le premier moment qui existe.
Mise à jour concernant les fuseaux horaires:
Puisque startOfDayForDate est une méthode sur NSCalendar, il utilise le fuseau horaire de NSCalendar. Donc, si je voulais voir l’heure à New York, quand j’ai commencé aujourd’hui à Los Angeles, je pourrais le faire:
let losAngelesCalendar = NSCalendar.currentCalendar().copy() as! NSCalendar losAngelesCalendar.timeZone = NSTimeZone(name: "America/Los_Angeles")! let dateTodayBeganInLosAngeles = losAngelesCalendar.startOfDayForDate(NSDate()) dateTodayBeganInLosAngeles.timeIntervalSince1970 let dateFormatter = NSDateFormatter() dateFormatter.dateStyle = .MediumStyle dateFormatter.timeStyle = .ShortStyle dateFormatter.timeZone = NSTimeZone(name: "America/New_York")! let timeInNewYorkWhenTodayBeganInLosAngeles = dateFormatter.ssortingngFromDate(dateTodayBeganInLosAngeles) print(timeInNewYorkWhenTodayBeganInLosAngeles) // prints "Jul 29, 2015, 3:00 AM"
NSCalendar *cal = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; [cal setTimeZone:[NSTimeZone systemTimeZone]]; NSDateComponents * comp = [cal components:( NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:[NSDate date]]; [comp setMinute:0]; [comp setHour:0]; [comp setSecond:0]; NSDate *startOfToday = [cal dateFromComponents:comp];
Si vous voulez dire minuit à 23h59, définissez l’heure du composant sur 23 et les minutes sur 59.
Vous pouvez utiliser la méthode suivante pour obtenir la valeur de minuit pour un NSDate.
- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate { // Use the user's current calendar and time zone NSCalendar *calendar = [NSCalendar currentCalendar]; NSTimeZone *timeZone = [NSTimeZone systemTimeZone]; [calendar setTimeZone:timeZone]; // Selectively convert the date components (year, month, day) of the input date NSDateComponents *dateComps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:inputDate]; // Set the time components manually [dateComps setHour:0]; [dateComps setMinute:0]; [dateComps setSecond:0]; // Convert back NSDate *beginningOfDay = [calendar dateFromComponents:dateComps]; return beginningOfDay; }
Thkis est extrait de ce site .
Rapide:
let cal = NSCalendar.currentCalendar() //tip:NSCalendarUnit can be omitted, but with the presence of it, you can take advantage of Xcode's auto-completion var comps = cal.components(NSCalendarUnit.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit | .HourCalendarUnit | .MinuteCalendarUnit | .SecondCalendarUnit, fromDate: NSDate()) comps.hour = 0 comps.minute = 0 comps.second = 0 let midnightOfToday = cal.dateFromComponents(comps)!
Swift 2.2:
let cal = NSCalendar.currentCalendar() let comps = cal.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: NSDate()) comps.hour = 0 comps.minute = 0 comps.second = 0 let midnightOfToday = cal.dateFromComponents(comps)!
Objectif c:
NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *comps = [cal components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:[NSDate date]]; [comps setHour:0]; [comps setMinute:0]; [comps setSecond:0]; NSDate *midnightOfToday = [cal dateFromComponents:comps];
essaye ça:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate *now = [NSDate date]; NSDateComponents *components = [gregorian components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:now]; NSDateFormatter* df = [[NSDateFormatter alloc]init]; [df setDateFormat:@"MM/dd/yyyy HH:mm:ss.SSS"]; NSLog(@"%@",[df ssortingngFromDate:[gregorian dateFromComponents:components]]);
NSDate *now = [NSDate date]; NSDate *beginningOfToday = nil; [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfToday interval:NULL forDate:now];
Vous pouvez utiliser dateBySettingHour dateBySettingHour:minute:second:ofDate:options:
Donc ce serait aussi simple que de faire:
NSCalendar *calendar = [NSCalendar currentCalendar]; calendar.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; NSDate *midnight = [calendar dateBySettingHour:0 minute:0 second:0 ofDate:[NSDate date] options:0];
let calendar = NSCalendar.currentCalendar() let unitFlags: NSCalendarUnit = [.Year, .Month, .Day, .Minute, .Second] let components = calendar.components(unitFlags , fromDate: NSDate()) components.hour = 0 components.minute = 0 components.second = 0 //Gives Midnight time of today let midnightOfToday = calendar.dateFromComponents(components)!
Depuis iOS8, vous pouvez utiliser startDayForDate.
Donc, pour commencer aujourd’hui (Objectif -C):
NSDate * midnight; midnight = [[NSCalendar currentCalendar] startOfDayForDate: [NSDate date]];