отформатировать uidatepicker в другой nsdate - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть UIDatePicker, и я получаю дату, используя это:

   NSDate *pickerDate = [datePickerView date];

Я хочу создать в будущем дату, основанную на дне недели и времени (ЧЧ: мм:ss) от pickerDate.Вот код, который я использую, но неправильная дата его создания:

ОБНОВЛЕННЫЙ КОД

        //format the uidatepicker
        NSDate *dateSet = pickerDate;
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setTimeZone:[NSTimeZone localTimeZone]];
        [df setDateFormat:@"EEEE HH:mm:ss"];
        NSString *dateSetString = [df stringFromDate:dateSet];

        NSLog(@"repeatDateString %@",dateSetString);//prints "Tuesday 12:12:43"

        //create a new nsdate using the new format
        NSDateFormatter *dateFormat2 = [[NSDateFormatter alloc] init];
        [dateFormat2 setTimeZone:[NSTimeZone localTimeZone]];
        [dateFormat2 setDateFormat: @"EEEE HH:mm:ss"];

        NSDate *newDate = [[NSDate alloc] init];
        newDate = [dateFormat2 dateFromString:dateSetString];

        NSLog(@"new Date %@",newDate);//prints "1970-01-06 04:42:43 +0000"

1 Ответ

1 голос
/ 03 апреля 2012

Проблема в том, что ваша строка даты не содержит всю информацию из средства выбора и не содержит достаточно информации для воссоздания даты.В нем отсутствуют День, Месяц и Год, поэтому при его повторном создании предполагается, что вы хотите начать с запуска календарной системы iOS NSDate.

Вам либо нужно сохранить NSDateчто вы получаете от сборщика (предпочтительно), или вам нужно использовать формат даты, который содержит достаточно информации для создания конкретной даты и времени.

РЕДАКТИРОВАТЬ
На основе вашего комментарияВы хотите просто использовать день недели и время из datePicker и определить следующую дату в будущем с этими значениями.Вот код, который выполнит это:

NSCalendar          *cal            = [NSCalendar currentCalendar];

NSDate              *pickerDate     = self.datePickerView.date;
NSDateComponents    *pickerComps    = [cal components:  NSWeekdayCalendarUnit |
                                                        NSHourCalendarUnit |
                                                        NSMinuteCalendarUnit |
                                                        NSSecondCalendarUnit
                                             fromDate:pickerDate];

NSDate              *currentDate    = [NSDate date];
NSDateComponents    *currentComps   = [cal components:  NSYearCalendarUnit | 
                                                        NSMonthCalendarUnit | 
                                                        NSWeekdayCalendarUnit |
                                                        NSDayCalendarUnit |
                                                        NSHourCalendarUnit |
                                                        NSMinuteCalendarUnit |
                                                        NSSecondCalendarUnit
                                             fromDate:currentDate];

// Start with the current date and add/subtract the number of days needed to make it the same day of the week
NSDateComponents    *newComps       = [currentComps copy];
NSUInteger          weekdayDiff     = pickerComps.weekday - currentComps.weekday;
newComps.day                        = newComps.day + weekdayDiff;
// If needed, add 7 days in order to move this date into the future
if (newComps.day < currentComps.day) {
    newComps.day = newComps.day + 7;
}

NSDate *newDate = [cal dateFromComponents:newComps];
if ([newDate compare:currentDate] == NSOrderedAscending) {
    // This is true when the weekday started out the same but the time of day is earlier in the picker.  
    // Add 7 days
    newComps.day = newComps.day + 7;
    newDate = [cal dateFromComponents:newComps];
}

NSLog(@"%@", newDate);
...