Базовые данные в японском календаре неверно сравнивают даты - PullRequest
0 голосов
/ 31 мая 2011

Так что, похоже, я снова сгораю от поддержки календаря iPhone снова . Я столкнулся с проблемой, когда основные данные сравнивают даты. Базовые данные, похоже, хранят даты с использованием григорианского календаря в том виде, в каком они выходят в формате 20XX-MM-dd. Но когда я создаю NSP-предикат таким образом

[nsRequest setPredicate:[NSPredicate predicateWithFormat:@"publish <= %@ AND expires >= %@", [NSDate date], [NSDate date]]]

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

Таким образом, может показаться, что если бы сегодня была дата «2011-05-31», то в японском календарном режиме базовые данные используют «0023-05-31», поскольку это 23-й год текущего императора, поэтому дата ввода будет 2000 лет до того, с чем его сравнивают.

Я обнаружил, что могу обойти это так

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0]] autorelease]];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"];
NSString *todayGregorian = [[dateFormat stringFromDate:[NSDate date]] retain];
[dateFormat release];

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"];
[nsRequest setPredicate:[NSPredicate predicateWithFormat:@"publish <= %@ AND expires >= %@", [df dateFromString:todayGregorian], [df dateFromString:todayGregorian]]];

но я надеюсь, что, может быть, я идиот, и есть лучший способ. Какие-либо предложения?

Обратите внимание:

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

Реальная проблема Мое решение выше неверно. Ответ TechZen заставил меня задуматься, и я хотел бы проголосовать за него 100 раз, и я решил проблему.

Моя проблема заключается в том, что данные, поступающие в Core Data, отправляются сервером в GMT, и анализатор формы, что данные не обязательно должны быть в GMT, поэтому мне нужно правильно настроить время входа в Core Data.

1 Ответ

2 голосов
/ 31 мая 2011

У вас действительно нет другого выбора, кроме как переводить NSDate в различные календари, особенно если ваши пользователи используют несколько календарей.

Объектами календаря являются не сами даты, а специализированные средства форматирования. Все даты на самом деле хранятся в стандартном формате GMT ​​независимо от календаря, с которого они были созданы. Затем они переводятся / форматируются в соответствующий календарь по мере необходимости. Мы не видим этого сразу в приложениях, ориентированных на западников, потому что современные западные календари основаны на GMT, поэтому перевод не нужен.

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

Как правило, время беспокоиться о программировании данных и времени - это не когда код кажется сложным, а когда он кажется простым.

...