2

フォーラムを検索したところ、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 Simulator でこれをテストしています。

編集#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:そして最後になりましたが、私はそれを自分で解決しました。ありがたいことに、これはこれまでで最もばかげた間違いだからです。NSTimeInterval は float ではなく double です。そして今まで、フロートを使用して NSUserDefaults に保存することで問題が発生したことはありませんでしたが、エラーが発生したようです。

4

1 に答える 1

0

NSLogステートメントの形式が間違っているようです(つまり、「0001-01-01」の部分)。代わりにこれを試してください:

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

NSLog(@"%@", output);
于 2012-05-21T16:02:42.070 に答える