В чем разница между NSRepublicOfChinaCalendar и NSGregorianCalendar?
-
11-12-2019 - |
Вопрос
Я разработал приложение, которое много работает с датами, а также сохраняет их в виде строк в основных данных, используя этот метод:
- (NSDate*) stringToDate{
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yy-MM-dd HH:mm"];
NSDate *date = [dateFormat dateFromString:self];
return date;
}
Работа с датой / временем довольно сложна - только разница во времени между системным и локальным временем - в любом случае вышеупомянутый метод должен позаботиться об этом.(Так что я надеюсь, поскольку форматирование NSDate в NSString возвращает правильное местное время вместо просмотра переменной NSDate в отладчике, которая показывает разницу в 2 часа в моем случае)
Существует также множество вычислений, подобных этому:
NSCalendar *calendar = [NSCalendar currentCalendar]; <------
NSDateComponents *components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit |NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:someDate];
NSInteger now_hour = [components hour];
NSInteger now_minute = [components minute];
NSInteger yearx = [components year];
NSInteger monthx = [components month];
NSInteger dayx = [components day];
где мне нужно установить / изменить / создать определенные даты / время, выполнить вычисления и снова извлечь / сохранить их в core data в виде NSStrings.
Мой вопрос касается использования соответствующего календаря.
Должен ли я всегда писать:
NSCalendar *calendar = [NSCalendar currentCalendar]; ?
или
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
и
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSRepublicOfChinaCalendar];
исп..в зависимости от того, используется ли приложение в Европе / США или Китае?
Решение
Ваш метод stringToDate
на самом деле это не совсем сработает, понимаете QA1480.Короткая версия:то NSDateFormatter
к сожалению, у него две, слегка противоречивые, роли — декодирование и кодирование определенных текстовых форматов и преобразование дат для отображения.Поскольку последнее связано с локалью, оно используется по умолчанию.Чтобы гарантировать, что вы получите прежнее поведение, вы должны явно задать en_US_POSIX
языковой стандарт, который гарантированно точно соответствует вашей строке даты.
Тем не менее, вы, кажется, немного сбиты с толку тем, что такое NSDate
является.Это не случайность NSString
или любое другое письменное указание даты.Это абстрактная запись точного момента.Таким образом, это совершенно не связано с текущим календарем.Календарь пользователя и языковой стандарт будут влиять на способ печати дат, но это не влияет на сами даты.Сейчас - это все еще сейчас, как бы вы это ни писали.Вот почему, когда вы применяете форматировщик к дате, вы получаете правильную местную дату, но если вы просто вводите дату в консоль, то получаете что-то абстрактное и не обязательно в вашем местном часовом поясе. NSDate
не имеет понятия о часовых поясах или разных календарях.
Core Data может хранить даты напрямую (т.е. вам вообще не нужно вручную преобразовывать их в строки from, как и для числовых значений), поэтому я не совсем уверен, к чему вы клоните.Но нормальное поведение заключается в использовании currentCalendar
когда вы хотите отобразить что-то для пользователя.Это будет отображаться в соответствии с их часовым поясом и другими настройками.
Согласно QA, для применения строк с фиксированной датой вы должны использовать средство форматирования даты с явно заданным языковым стандартом и вообще не думать о календаре.