Как я могу получить объект NSDate на сегодня в полночь?
каков наиболее эффективный способ получения объекта NSDate, представляющего полночь текущего дня?
10 ответов:
попробуйте это:
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];
новый API в iOS 8
iOS 8 включает в себя новый метод на NSCalendar под названием startOfDayForDate, который очень прост в использовании:
let startOfToday = NSCalendar.currentCalendar().startOfDayForDate(NSDate())
описание Apple:
этот API возвращает дату первого момента указанной даты. Передайте [nsdate date], например, если вы хотите начать "сегодня". Если было две полуночи, то возвращается первая. Если его не было, он возвращается в первый момент это действительно существовало.
обновление, касающееся часовых поясов:
поскольку startOfDayForDate является методом на NSCalendar, он использует часовой пояс NSCalendar. Поэтому, если бы я хотел посмотреть, сколько времени было в Нью-Йорке, когда сегодня началось в Лос-Анджелесе, я мог бы сделать это:
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.stringFromDate(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];
Если вы имеете в виду полночь как 23:59, то установите час компонента как 23 и минуты как 59.
вы можете использовать следующий метод, чтобы получить Полуночное значение для 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 берется отсюда сайт.
Swift:
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)!
Цель-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];
попробуйте это:
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 stringFromDate:[gregorian dateFromComponents:components]]);
NSDate *now = [NSDate date]; NSDate *beginningOfToday = nil; [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfToday interval:NULL forDate:now];
вы могли бы использовать NSCalendar ' s
dateBySettingHour:minute:second:ofDate:options:
Так что это было бы так же просто, как делать:
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)!