Как установить время на NSDate? - PullRequest
8 голосов
/ 03 сентября 2011

Я хочу установить время NSDate с желаемыми часами: минутами: секундами В настоящее время я работаю с компонентом NSDate, но он не дает желаемого результата

[comps setHour: -hours];
[comps setMinute:0];
[comps setSecond:0];
NSDate *minDate = [calendar_c dateFromComponents:comps];

Ответы [ 6 ]

22 голосов
/ 14 августа 2013

Прекрасно работает как NSDate категория.

/** Returns a new NSDate object with the time set to the indicated hour, 
  * minute, and second.
  * @param hour The hour to use in the new date.
  * @param minute The number of minutes to use in the new date.
  * @param second The number of seconds to use in the new date.
  */
-(NSDate *) dateWithHour:(NSInteger)hour 
                  minute:(NSInteger)minute 
                  second:(NSInteger)second 
{
   NSCalendar *calendar = [NSCalendar currentCalendar];
   NSDateComponents *components = [calendar components: NSYearCalendarUnit|
                                                         NSMonthCalendarUnit|
                                                         NSDayCalendarUnit
                                               fromDate:self];
    [components setHour:hour];
    [components setMinute:minute];
    [components setSecond:second];
    NSDate *newDate = [calendar dateFromComponents:components];
    return newDate;
}

С помощью вышеуказанной категории, если у вас есть существующая дата, на которую вы хотите изменить время, вы делаете это следующим образом:

NSDate *newDate = [someDate dateWithHour:10 minute:30 second:00];

Если, однако, вы пытаетесь добавить или вычесть часы из существующей даты, метод категории для этого также прост:

/** Returns a new date with the given number of hours added or subtracted.
  * @param hours The number of hours to add or subtract from the date.
  */
-(NSDate*)dateByAddingHours:(NSInteger)hours
{
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setHour:hours];

    return [[NSCalendar currentCalendar] 
               dateByAddingComponents:components toDate:self options:0];
}
17 голосов
/ 25 сентября 2011

Ваш подход должен работать нормально.Мне нужно решение этой проблемы типа (установка отдельных компонентов даты), и следующий код работает, как и ожидалось для меня.Моя ситуация: я хотел создать объект даты, который использовал бы текущую дату, но имел время, установленное в значение, которое было передано в виде строки.обратите внимание на часовые пояса, когда вы судите, является ли время точным.Например, в моем приложении, когда вы остановитесь на точке останова, вы увидите время по Гринвичу (поэтому оно выглядит иначе, чем время ввода, которое соответствует моему местному времени), но когда время фактически отображается на экране вприложение, оно форматируется для отображения в местном часовом поясе.Возможно, вам придется принять это во внимание, чтобы определить, действительно ли результат на отличается от того, что вы ожидаете.«?Какой результат это дает и как это соотносится с тем, что вы ожидали?

2 голосов
/ 05 марта 2016

Свифт2

extension NSDate {
    func dateWithHour (hour: Int, minute:Int, second:Int) ->NSDate?{

        let calendar = NSCalendar.currentCalendar(),
            components = calendar.components([.Day,.Month,.Year], fromDate: self)
        components.hour = hour;
        components.minute = minute;
        components.second = second;

        return calendar.dateFromComponents(components)
    }
}
0 голосов
/ 28 июня 2019

Решение Swift 5 (на основе ответа @dattk) для тех, кто боится предупреждений об устаревании :)

func date(withHour hour: Int, withMinute minute: Int, withSeconds second: Int) -> Date? { 
   let now = Date() 
   let calendar = NSCalendar.current 
   var components = calendar.dateComponents([.day,.month,.year], from: now)   
   components.hour = hour 
   components.minute = minute 
   components.second = second 
   return calendar.date(from: components) 
}
0 голосов
/ 21 августа 2018

Вы можете установить от 0 до часа, мин и секунды.

NSDateFormatter *tFmt = [[NSDateFormatter alloc] init];

tFmt.dateFormat = @"yyyy-MM-dd";

NSString *strNowDate = [NSString stringWithFormat:@"%@ 00:00:00",[tFmt stringFromDate:[NSDate date]]];

NSDate *nowDate = [NSDate dateWithString:strNowDate formatString:@"yyyy-MM-dd HH:mm:ss"];
0 голосов
/ 05 сентября 2015
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *comps = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:[NSDate date]];
comps.hour = 0;
comps.minute = 15;
NSDate *date = [calendar dateFromComponents:comps];

iOS 8

...