2012-04-03 7 views
0

Ich habe einen UIDatePicker und ich bekomme das Datum mit diesem:Format UIDatePicker zu einer anderen NSDate

NSDate *pickerDate = [datePickerView date]; 

ich ein Datum in der Zukunft schaffen will, die am Tag der Woche basieren und die Zeit (HH : mm: ss) aus dem PickerDate. Hier ist der Code, den ich verwende, aber das Datum, die es erzeugt, ist falsch:

AKTUALISIERT CODE

 //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" 

Antwort

1

Das Problem ist, dass Sie das Datum Zeichenfolge enthält nicht alle Informationen aus dem Picker, und enthält nicht genügend Informationen, um das Datum neu zu erstellen. Es fehlt Tag, Monat und Jahr. Wenn Sie es neu erstellen, wird davon ausgegangen, dass Sie am Anfang von iOS NSDate Kalendersystem starten möchten.

Sie müssen entweder die NSDate speichern, die Sie von der Auswahl empfangen (vorzugsweise), oder Sie müssen ein Datumsformat verwenden, das genügend Informationen enthält, um ein bestimmtes Datum und eine bestimmte Uhrzeit zu erstellen.

EDIT
Basierend auf Ihrem Kommentar, Sie wollen einfach nur den Wochentag und die Uhrzeit aus dem Datepicker verwenden und den nächsten Termin in der Zukunft mit diesen Werten bestimmen. Hier ist Code, der das bewerkstelligen wird:

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); 
+0

Ich sehe. Tatsächlich setze ich ein Datum, das ich für das repeatInterval meiner localnotification und Im benutze NSWeekCalendarUnit verwenden werde. Daher möchte ich meine Benachrichtigung mit dem Datum an einem bestimmten Tag und zu einer bestimmten Uhrzeit wiederholen, weshalb ich ein Nsdate wie das in meinem Code erstellen möchte. Gibt es dafür einen besseren Ansatz? – Diffy

+0

Also, was Sie am Ende wollen, ist "nächsten Dienstag um 12:12:43" (freut sich von jetzt an)? – lnafziger

+0

ja. so will ich es haben. – Diffy