Как мне создать текущую дату (или любую дату) как NSDate без часов, минут и секунд? - PullRequest
6 голосов
/ 28 января 2011

Мне нужно создать NSDate текущей даты (или любого NSDate) без часов, минут и секунд и сохранить его как NSDate, как можно меньше строк?

Мне нужно выполнить некоторые вычисления по датам, и если часы, минуты и секунды вызывают проблемы, мне нужны абсолютные даты (надеюсь, абсолютная - это правильная фраза).Это для приложения для iPhone.

Я создаю даты с [NSDate date], которые добавляют часы, минуты и секунды.Кроме того, я добавляю месяцы к датам, которые, как мне кажется, позволяют сэкономить на дневном свете, поскольку в некоторые даты у меня получается 2300 часов.

Поэтому в идеале мне нужна функция для создания абсолютных NSDates из NSDates.

Я знаю, что задавал подобный вопрос ранее, но мне нужно закончить с NSDate, а не строкой, и я немного обеспокоен указанием формата даты, например, гггг и т. Д.

Ответы [ 2 ]

32 голосов
/ 28 января 2011

Во-первых, вы должны понимать, что даже если вы удалите часы, минуты и секунды из NSDate, это все равно будет представлять один момент времени.Вы никогда не получите NSDate для представления всего дня наподобие 2011-01-28;это всегда будет 2011-01-28 00:00:00 +00:00.Это означает, что вам также необходимо учитывать часовые пояса.

Вот метод (который должен быть реализован как категория NSDate), который возвращает NSDate в полночь UTC в тот же деньself:

- (NSDate *)midnightUTC {
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    NSDateComponents *dateComponents = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                                                   fromDate:self];
    [dateComponents setHour:0];
    [dateComponents setMinute:0];
    [dateComponents setSecond:0];

    NSDate *midnightUTC = [calendar dateFromComponents:dateComponents];
    [calendar release];

    return midnightUTC;
}
2 голосов
/ 22 мая 2015
NSDate *oldDate = [NSDate date];
NSCalendarUnit requiredDateComponents = NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit;    
NSDateComponents *components = [[NSCalendar currentCalendar] components:requiredDateComponents fromDate:oldDate]; 
NSDate *newDate = [[NSCalendar currentCalendar] dateFromComponents:components];
...