Pergunta

Desenvolvi um aplicativo que funciona muito com datas e também as armazena como strings nos dados principais usando este método:

- (NSDate*) stringToDate{
   NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
   [dateFormat setDateFormat:@"yy-MM-dd HH:mm"];
   NSDate *date = [dateFormat dateFromString:self];

   return date;

}

Trabalhar com data/hora é bastante complicado - apenas a diferença de horário entre o sistema e a hora local - de qualquer forma, o método acima deve cuidar disso.(Espero que a formatação de um NSDate para um NSString retorne a hora local correta em vez de olhar para a variável NSDate no depurador, que mostra uma diferença de 2 horas no meu caso)

Existem também muitos cálculos como este:

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

onde preciso definir/alterar/criar determinadas datas/horas, fazer cálculos e recuperá-los/armazená-los nos dados principais novamente como NSStrings.

Minha pergunta é sobre como usar o calendário apropriado.

Devo sempre escrever:

NSCalendar *calendar = [NSCalendar currentCalendar]; ?

ou

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

e

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSRepublicOfChinaCalendar];

especialmente.dependendo se o aplicativo é usado na Europa/EUA x China?

Foi útil?

Solução

Seu método stringToDate na verdade não vai funcionar exatamente, veja QA1480.Versão curta:o NSDateFormatter infelizmente tem duas funções ligeiramente contraditórias - decodificar e codificar formatos de texto específicos e converter datas para exibição.Como o último está relacionado à localidade, é o padrão.Para garantir que você obtenha o comportamento anterior, você deve definir explicitamente o en_US_POSIX locale, que é garantido exatamente para honrar sua string de data.

Dito isto, você parece estar um pouco confuso sobre o que é NSDate é.Não é um NSString ou qualquer outra representação escrita de uma data.É um registro abstrato de um momento exato.Portanto, não tem nenhuma relação com o calendário atual.O calendário e a localidade do usuário afetarão a forma como as datas são impressas, mas não afetam as datas em si.Agora ainda é agora, não importa como você o escreva.É por isso que quando você aplica um formatador a uma data, você obtém uma data local correta, mas se você apenas registrar uma data no console, obterá algo abstrato e não necessariamente no seu fuso horário local. NSDate não tem noção de fusos horários ou de calendários diferentes.

Core Data pode armazenar datas diretamente (ou seja, não há necessidade de converter manualmente para strings from, assim como não há para valores numéricos), portanto, não tenho certeza do que você está querendo dizer.Mas o comportamento normal é usar currentCalendar quando você deseja exibir algo para o usuário.Isso será exibido de acordo com o fuso horário e outras configurações.

De acordo com o controle de qualidade, para aplicar sequências de datas fixas, você deve usar um formatador de data com uma localidade definida explicitamente e não pensar no calendário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top