Вопрос:

UIDatePicker возвращает неправильную дату (-1 день к реальной дате)

ios objective-c cocoa-touch uidatepicker

7324 просмотра

8 ответа

592 Репутация автора

У меня есть UIDatePickerмм / дд / гг. Он работает нормально, но есть одна проблема: я устанавливаю minimumи maximumдату, и когда пользователь пытается выбрать запрещенный день, месяц или год, [datePicker date]свойство начинает работать неправильно. Возвращает вам current day - 1или current month - 1или или current year - 1. Я добавил несколько фотографий, чтобы вы могли увидеть ситуацию.

Правильная дата Это правильно
неправильная дата это неправильно (после выбора запрещенной даты)

Кто-нибудь знает, как я могу это исправить? Спасибо !

UPD: код

[self.myDatePicker setMinimumDate:[NSDate date]];
[self.myDatePicker setMaximumDate:[[NSDate date] addTimeInterval:2 * 365.25 * 24 * 60 * 60]]; // to get upto 5 years
NSDate * now = [[NSDate alloc] init];
[self.myDatePicker setDate: now animated: YES];

self.myDatePicker.timeZone = [NSTimeZone localTimeZone];
self.myDatePicker.calendar = [NSCalendar currentCalendar];
Автор: SmartTree Источник Размещён: 07.01.2013 05:11

Ответы (8)


0 плюса

42900 Репутация автора

Может быть из-за TimeZone ...

Установите свой часовой пояс.

Автор: Anoop Vaidya Размещён: 07.01.2013 05:15

5 плюса

25336 Репутация автора

Проверьте, не используете ли вы неправильные символы форматирования большими буквами: «ГГГГ». Замените их на «гггг».

Автор: AlexWien Размещён: 07.01.2013 05:21

5 плюса

48604 Репутация автора

Решение

Это определенно что-то с часовыми поясами и / или летним временем. Но это должно быть очень тонко, так как код выглядит хорошо (за исключением интервала). Теперь на мой вопрос о том, находитесь ли вы в России:

В этом году Кремль сделал несколько взмахов вперед, чтобы сохранить летнее время навсегда. На самом деле я не уверен, что они решили наконец. Но возможно это не отражено правильно в Какао. В видеоролике WWDC 2011 «Сессия 117 - Выполнение календарных расчетов» ведущий даже упоминает, что подобные вещи могут произойти.

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


Мир только что увидел подобное поведение в iOS 6: ошибка DND-Always-Active. Могу поспорить, что это был неправильный формат даты ( YYYYвместо yyyy)


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

Автор: vikingosegundo Размещён: 07.01.2013 05:46

1 плюс

2576 Репутация автора

Я столкнулся с той же проблемой, и вот что я получил:

Не используйте [описание даты], чтобы проверить NSDate, если вы хотите правильное представление для вашей системы. Используйте NSDateFormatter, потому что он показывает дату на основе ваших системных настроек (в симуляторе это будут настройки симуляторов).

Например:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateStyle:NSDateFormatterShortStyle];
[df setTimeStyle:NSDateFormatterNoStyle];
NSLog(@"date for locale is %@", [df stringFromDate:date]);
Автор: Vladimir Shutyuk Размещён: 31.03.2013 10:11

0 плюса

363 Репутация автора

Boolean futureevent;
- (void)viewDidLoad
{
 futureevent = false;
}

int intervall = (int) [currentdate timeIntervalSinceDate: datePicker.date] / 60;

if (intervall < 1200 && intervall > 0)
{
    futureevent = true;
    NSDate *newDate1 = [datePicker.date dateByAddingTimeInterval:60*60*24*1];
    birthdate = [newDate1.description substringToIndex:spaceRange.location];
}
else
{
    if (futureevent)
    {
        NSDate *newDate1 = [datePicker.date dateByAddingTimeInterval:60*60*24*1];
        birthdate = [newDate1.description substringToIndex:spaceRange.location];
    }
    else
    {
        birthdate = [datePicker.date.description substringToIndex:spaceRange.location];
    }
}
Автор: Jim Clermonts Размещён: 23.06.2013 11:34

6 плюса

2989 Репутация автора

Мое решение состояло в том, чтобы установить возвращенную дату на 12:00, поскольку NSDates работает в UTC

NSDate * adjustedDate = [[NSCalendar currentCalendar] dateBySettingHour:12 minute:0 second:0 ofDate:sender.date options:0];

Также для расчета даты вы должны использовать NSCalenderметоды, а неaddTimeInterval

Автор: João Nunes Размещён: 30.10.2014 01:08

4 плюса

711 Репутация автора

Просто добавьте одну строку кода для установки часового пояса.

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

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

Автор: Arundev Размещён: 09.11.2016 04:09

0 плюса

1 Репутация автора

Это не возвращает неправильную дату. В действительности, когда вы выбираете так называемую запрещенную дату, сборщик даты сбрасывается до максимально или минимально допустимой даты с первым моментом дня, то есть 12:00.

Так, если вы находитесь в месте, где часовой пояс, например, на 2 часа опережает время по Гринвичу, дата, возвращаемая палитрой дат, будет вчерашним 22:00 по Гринвичу. Так что здесь вы можете подумать, что он возвращает вчерашнюю дату, но если вы конвертируете ее в свой часовой пояс, вы получите только сегодняшнюю дату, но компонент времени будет 12:00 AM.

Автор: Apoorv Размещён: 13.06.2019 05:01
Вопросы из категории :
32x32