NSDateFormatter发生了奇怪的事情

时间:2014-02-06 17:04:28

标签: objective-c nsdate nsdateformatter nsdatecomponents

我正在使用UIPickerView来显示可供选择的时间,这个时间要从00:00到23:00,但是我显然做错了,因为我的时间是11:58到10:58。这就是我在做的事情:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    NSDateComponents *dateComponents = [calendar components: NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit
                                                   fromDate:[NSDate date]];
    [dateComponents setHour:row];
    [dateComponents setMinute:0];
    [dateComponents setSecond:0];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];

    return [dateFormatter stringFromDate:[calendar dateFromComponents:dateComponents]];
}

任何帮助都会非常感激。

谢谢, 尼克

2 个答案:

答案 0 :(得分:1)

我看不出有任何理由在您的选择器委托方法中使用日期格式化程序。一天中的小时数和分钟数是固定的。为什么不向用户提供一个两列选择器,在另一个中提供一小时和几分钟的小时。

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [NSString stringWithFormat:@"%02d", row];
}

以下是您的选择器数据源方法的样子。

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    // Two picker columns, one for hours, one for minutes
    return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    switch (component) {
        case 0:
            return 24;
        case 1:
            return 60:
    }
}

然后,当您的用户完成选择时,请根据他们选择的内容构建日期。

- (IBAction)didTapDonePickingButton:(id)sender
{
    NSInteger hour = [_pickerView selectedRowInComponent:0];
    NSInteger minute = [_pickerView selectedRowInComponent:1];

    // Build out your date here...
}

更好,您是否知道可以在界面构建器中使用UIDatePicker并将其模式设置为“Time”。

enter image description here

这会给你几小时和几分钟。像这样:

enter image description here

答案 1 :(得分:0)

@Larme给了我所需的答案(为NSDateFormatter设置时区)。