2011-12-02 11 views
5

Tôi đang sử dụng UIDatePicker trong ứng dụng của tôi và khi tôi lấy ngày đó đã được lựa chọn với:UIDatePicker trở sai NSDate

NSDate *date = picker.date; 

picker.date trả lại ngày trước ngày mà tôi đã chọn.

bất kỳ ý tưởng nào tại sao nó xảy ra?

+0

Bạn đang sử dụng một UIImagePicker (như trong câu hỏi của bạn) hoặc một UIDatePicker (như trong tiêu đề câu hỏi của bạn)? Bạn có đang tùy chỉnh bộ chọn ngày theo bất kỳ cách nào không? –

+0

lỗi của tôi, tôi đang sử dụng UIDatePicker – MTA

Trả lời

8

UIDatePicker sẽ hiển thị ngày tháng và thời gian trong múi giờ địa phương của bạn. Tuy nhiên, NSDate không có bất kỳ khái niệm nào về múi giờ vì nó lưu trữ số giây tuyệt đối kể từ ngày tham chiếu. Khi NSLogging một ngày, nó hiển thị ngày giờ theo giờ GMT. Tôi hy vọng nếu bạn làm việc ra sự khác biệt múi giờ địa phương của bạn từ GMT, bạn sẽ thấy rằng đó là ngày chính xác.

Thử tạo NSDateFormatter hoặc NSCalendar bằng ngôn ngữ thích hợp và chuyển ngày qua đó.

Để đọc thêm về chủ đề chung này, hãy xem this site written by another SO contributor.

+0

tôi chọn chỉ cung cấp cho người dùng để chọn ngày không có thời gian – MTA

+2

Không có NSDate không có thời gian. Bạn chỉ không hiển thị nó. Câu trả lời vẫn như cũ. – jrturton

+0

cùng một vấn đề ở đây. cố định bằng cách thêm 'setTimeZone:' & 'setLocale:' vào UIDatePicker của tôi. – HelmiB

1

Bạn đã kiểm tra múi giờ chưa?

Khi bạn in NSDate, nó sẽ sử dụng GMT làm múi giờ.

Nếu bạn đặt múi giờ hệ thống thành NSDateFormatter, bạn có thể nhận được một ngày khác, bởi vì nó sẽ mất múi giờ và tính toán thời gian cho phù hợp.

Thêm mã này và xem nếu đầu ra là chính xác:

NSDate *date = picker.date; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeZone:NSDateFormatterNoStyle]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 
NSLog(@"Date: %@", [dateFormmater stringFromDate:date]); 
[dateFormatter release], dateFormatter = nil; 
+0

vì vậy làm cách nào tôi có thể chỉ nhận được ngày được người dùng chọn – MTA

+0

Bạn có ngày mà người dùng chọn, nhưng bạn không có múi giờ. múi giờ đã sử dụng id của hệ thống hiện tại. – rckoenes

5

cung cấp cho một thử này làm việc cho tôi

 NSDate* sourceDate = [NSDate date]; 

     NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
     NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; 

     NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate]; 
     NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]; 
     NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset; 

     NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease]; 

// tôi xuất ra mỏ nhãn mà bạn có thể sử dụng bất cứ điều gì bạn thích

 NSString *dateOutput = [[[NSString alloc] initWithFormat:@"%@", destinationDate]autorelease]; 
     self.dateLabel.text = dateOutput; 
2

Hãy nhớ để tạo ra các NSDate và sau đó đầu ra nó với múi giờ và lịch hợp lệ!

NSDate chỉ thể hiện một thời điểm tuyệt đối. Nó không có khái niệm múi giờ (NY, Barcelona, ​​...) hoặc lịch (Gregorian, Hebrew, ...).

UIDatePicker lợi nhuận theo mặc định một NSDate với hệ thống NSCalendarNSTimeZone, nhưng khi bạn cố gắng để in nó sau này, bạn không định dạng đầu ra. Bạn có thể có sự không khớp.

Vì vậy, trước tiên bạn cần thiết lập UIDatePicker một cách chính xác và 2 chuyển đổi đầu ra bằng NSDateFormatter để biết Lịch và TimeZone đang được sử dụng.

Một mã ví dụ với init của UIDatePicker và sau đó in kết quả:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // init the UIDatePicker with your values 
    // by default UIDatePicker inits with today, system calendar and timezone 
    // Only for teaching purposes I will init with default values 
    NSDate * now = [[NSDate alloc] init]; 
    [_datePicker setDate: now] 
       animated: YES];  

    _datePicker.timeZone = [NSTimeZone localTimeZone]; 
    _datePicker.calendar = [NSCalendar currentCalendar]; 

    [_datePicker addTarget: self 
        action: @selector(getDatePickerSelection:) 
     forControlEvents:UIControlEventValueChanged]; 

} 


-(void)getDatePickerSelection:(id) sender 
{ 

    // NSDateFormatter automatically inits with system calendar and timezone 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    // Setup an output style 
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

    // Medium style date, short style time => "Nov 23, 1937 3:30pm" 
    NSString *dateString = [dateFormatter stringFromDate:date]; 

} 

Kiểm tra câu trả lời tôi đã làm cho một câu hỏi rất giống nhau:

NSDate output using NSDateFormatter

1

Chỉ cần thêm một dòng mã

self.datePicker.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 

0 là dành cho GMT 00. Thêm theo múi giờ của bạn.