Comment puis-je obtenir un object NSDate pour aujourd’hui à minuit?

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