UIDatePicker for time返回非常奇怪的结果

时间:2012-05-21 15:56:05

标签: objective-c ios nsdate nsuserdefaults nsdatepicker

我搜索了论坛,并且有很多关于UIDatePicker奇怪行为的帖子,但没有一个解决方案解决了我的问题。

我有一个简单的UIDatePicker初始化如下:

self.picker = [[UIDatePicker alloc] init];
self.picker.datePickerMode = UIDatePickerModeTime;
self.picker.calendar = [NSCalendar currentCalendar];
self.picker.timeZone = [NSTimeZone localTimeZone];
self.picker.date = self.initialDate;
[self.view addSubview:self.picker];

这是在一个简单视图的viewDidLoad方法中完成的(没有xib,没有接口构建器,只是普通代码)。

现在我有一个按钮,它可以检索日期并“处理”它。

NSDate* selected = self.picker.date;
NSLog(@"%@", selected);

NSDateComponents* components = [self.picker.calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:selected];
NSLog(@"0001-01-01 %02i:%02i:%02i +0000", components.hour, components.minute, components.second);

[components setSecond:0];
NSLog(@"0001-01-01 %02i:%02i:%02i +0000", components.hour, components.minute, components.second);

selected = [self.picker.calendar dateFromComponents:components];
NSLog(@"%@", selected);

由于日期选择器不允许用户设置秒数,我只想将它们重置为零(因为我需要稍后比较日期)。

当我选择“16:00”(下午4:00)时,日志输出为:

2012-05-21 17:43:48.428 Green Thumb[26828:fb03] 0001-01-01 14:55:36 +0000
2012-05-21 17:43:48.428 Green Thumb[26828:fb03] 0001-01-01 16:00:56 +0000
2012-05-21 17:43:48.429 Green Thumb[26828:fb03] 0001-01-01 16:00:00 +0000
2012-05-21 17:43:48.429 Green Thumb[26828:fb03] 0001-01-01 14:54:40 +0000

所以从选择器中取出的原始日期完全关闭。从组件(基于选取器的日期创建)创建的时间是正确的,校正时间也是正确的。但是,当我将组件放回NSDate实例时,它们都会再次混乱(但不同)。

我和谷歌我们都没有想法,所以我希望我们可以在这里创建一些新的!

提前致谢,LetzFlow

PS:我正在用iPhone 5.1模拟器进行测试。

编辑#1:

我已经找到了实际问题,但我再次陷入困境:

我已将其跟踪到以下几点:我将日期存储在NSUserDefaults对象中。

NSUserDefaults defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:[NSNumber numberWithFloat:[time timeIntervalSince1970]] forKey:@"notification.time"];

在这里我再次把它们拿出来:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSNumber num = [defaults valueForKey:@"notification.time"];
NSDate* time = [NSDate dateWithTimeIntervalSince1970:[num floatValue]];

有趣的是:进入的是什么,不是出来的!但为什么? :)

编辑#2:编辑#2: 最后但并非最不重要的是我自己解决了这个问题。值得庆幸的是,因为这是有史以来最愚蠢的错误。 NSTimeInterval不是float而是double。虽然到目前为止我从来没有遇到任何问题,使用浮动保存它在NSUserDefaults似乎提出了错误。

1 个答案:

答案 0 :(得分:0)

您的NSLog语句似乎格式错误(即“0001-01-01”部分)。试试这个:

NSString *output = [NSDateFormatter localizedStringFromDate:selected
                                                  dateStyle:NSDateFormatterShortStyle 
                                                  timeStyle:NSDateFormatterShortStyle];

NSLog(@"%@", output);