UIDatePicker时间

UIDatePicker time

我有一个 UIDatePicker 和一个按钮。当我按下按钮时,我想在日志中显示消息 "Setting a reminder for x",其中 x 是日期选择器显示的时间。

每次按下按钮,记录的时间都比选择器显示的时间晚了整整3个小时(选择器显示的时间就是我现在的时间)。我怀疑这与时区有关。我住在 GMT +2 时区(我猜是 +3,因为我们处于夏令时)。

你知道如何让记录的时间与显示的时间相同吗?

下面是按下按钮时执行的方法。谢谢

- (IBAction)addReminder:(id)sender {
    [self.datePicker setTimeZone:[NSTimeZone systemTimeZone]];
    NSLog(@"Setting a reminder for %@", self.datePicker.date);
}

NSDate 是某个时刻的简单表示,它对您的本地时间一无所知。当您记录它(实际上,当 description)消息被发送时,它使用 GMT 来显示自己。

UIDatePicker 默认使用您的时区(参见 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDatePicker_Class/#//apple_ref/occ/instp/UIDatePicker/timeZone)。

所以,这是它的工作原理:

  • 你在DatePicker中选择了某个时间,但时间是没有意义的,除非你指定时区。
  • DatePicker 使用您当地 (GMT+2) 时区并为其创建 NSDate
  • 你显示 NSDate 并且因为它对时区一无所知,所以它只是将自己显示为 GMT。

要显示您的日期,您应该使用 NSDateFormatter。它有时区 属性:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/#//apple_ref/occ/instp/NSDateFormatter/timeZone

您还可以使用 NSCalendar 及其组件。

您应该阅读本指南:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DatesAndTimes/DatesAndTimes.html 因为日期、格式化程序和日历在 Cocoa 中不是很清楚,除非您了解其概念。

试试这个...

NSDate *now = [[NSDate alloc] init];
[self.datePicker setDate:now];
[self.picker setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:2*60*60]]; // GMT+2 Your timeZone
NSLog(@"Setting a reminder for %@", self.datePicker.date);