UIDatePicker возвращает неправильный NSDate - PullRequest
5 голосов
/ 02 декабря 2011

Я использую UIDatePicker в своем приложении, и когда я беру дату, которая была выбрана с помощью:

NSDate *date = picker.date;

picker.date возвращено за день до выбранной даты.

есть идеи, почему это происходит?

Ответы [ 5 ]

8 голосов
/ 02 декабря 2011

UIDatePicker будет отображать дату и время в вашем местном часовом поясе.Однако NSDate не имеет никакого понятия о часовом поясе, так как в нем хранится абсолютное количество секунд с контрольной даты.Когда NSLogging дата, она показывает дату и время в GMT.Я ожидаю, что если вы определите разницу между вашим местным часовым поясом и временем по Гринвичу, вы увидите, что это правильная дата.

Попробуйте создать NSDateFormatter или NSCalendar с соответствующим языковым стандартом и пропустите дату через него.

Для получения дополнительной информации по этой общей теме см. этот сайт, написанный другим участником SO .

5 голосов
/ 30 марта 2012

попробуй у меня получилось

        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]; 

// я вывожу мой в метку, вы можете использовать все, что вам нравится

        NSString *dateOutput = [[[NSString alloc] initWithFormat:@"%@", destinationDate]autorelease];
        self.dateLabel.text = dateOutput;
2 голосов
/ 09 августа 2012

Не забудьте создать NSDate, а затем вывести его с правильным часовым поясом и календарем!

NSDate представляет только абсолютный момент времени. В нем нет понятия часового пояса (Нью-Йорк, Барселона, ...) или календаря (григорианский, иврит, ...).

UIDatePicker по умолчанию возвращает NSDate с системой NSCalendar и NSTimeZone , но при попытке распечатать его позже форматирование вывода не выполняется. Там может быть несоответствие.

Итак, во-первых, вам нужно правильно настроить UIDatePicker, а во-вторых, преобразовать вывод с помощью NSDateFormatter , чтобы он знал используемый календарь и часовой пояс.

Пример кода с инициализацией UIDatePicker и последующей печатью результата:

- (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];

}

Проверьте ответ, который я сделал для другого очень похожего вопроса:

Вывод NSDate с использованием NSDateFormatter

1 голос
/ 09 ноября 2016

Просто добавьте одну строку кода

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

0 для GMT 00. Добавить в соответствии с вашим часовым поясом.

1 голос
/ 02 декабря 2011

Вы проверяли часовой пояс?

Когда вы печатаете NSDate, он будет использовать GMT в качестве часового пояса.

Если вы установите системный часовой пояс NSDateFormatter, вы можете получить другойdate, потому что потребуется часовой пояс и рассчитать время соответствующим образом.

Добавьте этот код и посмотрите, верен ли вывод:

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;
...