Как я могу получить объект NSDate на сегодня в полночь? - PullRequest
59 голосов
/ 28 января 2012

Каков наиболее эффективный способ получения объекта NSDate, представляющего полночь текущего дня?

Ответы [ 10 ]

97 голосов
/ 29 апреля 2015

Новый 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"
65 голосов
/ 28 января 2012

Попробуйте это:

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];
12 голосов
/ 28 января 2012
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.

8 голосов
/ 11 января 2015

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)!

Objective-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];
8 голосов
/ 28 января 2012

Вы можете использовать следующий метод, чтобы получить значение полуночи для 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 взят здесь веб-сайт .

3 голосов
/ 21 сентября 2017

В iOS8 вы можете использовать startDayForDate.

Итак, чтобы начать сегодня (Цель -C):

NSDate * midnight;
 midnight = [[NSCalendar currentCalendar] startOfDayForDate: [NSDate date]];
1 голос
/ 23 апреля 2015
NSDate *now = [NSDate date];
NSDate *beginningOfToday = nil;
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfToday interval:NULL forDate:now];
1 голос
/ 28 января 2012

попробуйте это:

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]]);
0 голосов
/ 21 апреля 2016

Вы можете использовать NSCalendar 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];
0 голосов
/ 27 июня 2015
    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)!
...