В чем разница между NSRepublicOfChinaCalendar и NSGregorianCalendar?

StackOverflow https://stackoverflow.com//questions/11653012

  •  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, для применения строк с фиксированной датой вы должны использовать средство форматирования даты с явно заданным языковым стандартом и вообще не думать о календаре.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top