dateByAddingComponents e ficar diferença de datas com NSDateComponents
-
22-09-2019 - |
Pergunta
Eu estou tendo problemas com a inclusão de valores de datas e também a obtenção de diferenças entre datas.As datas e componentes calculados estão incorretas.
Assim, para adicionar, se eu adicionar a 1,5 meses, eu só recebo 1 mês, no entanto, se eu adicionar qualquer número inteiro ie (1 ou 2 ou 3 e etc) ele calcula corretamente.
Float32 addAmount = 1.5;
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setMonth:addAmount];
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *newDate2 = [gregorian dateByAddingComponents:components toDate:Date1 options:0];
Agora, pela diferença, se eu tiver uma data que tenha sido adicionado com exatamente um ano (quase o mesmo código acima), ele adiciona corretamente, mas quando a diferença é calculado, eu fico 0 anos, 11 meses e 30 dias.
NSDate *startDate = Date1;
NSDate *endDate = Date2;
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *components = [gregorian components:unitFlags
fromDate:startDate
toDate:endDate options:0];
NSInteger years = [components year];
NSInteger months = [components month];
NSInteger days = [components day];
O que estou fazendo de errado?Também adicionei o kCFCalendarComponentsWrap constanct nas opções tanto para a adição e a diferença de funções, mas sem diferença.
Obrigado
Solução
Assim, para adicionar, se eu adicionar 1,5 mês, eu apenas mais 1 mês, no entanto, se eu adicionar qualquer número inteiro ie (1 ou 2 ou 3 e etc) ele calcula corretamente.
O setMonth:
método em NSDateComponents
toma uma NSInteger
, não é um número de ponto flutuante.Assim, o comportamento é correto, como é simplesmente a truncar a 1,5 para 1.
Agora, pela diferença, se eu tiver uma data que tenha sido adicionado com exatamente um ano (quase o mesmo código acima), ele adiciona corretamente, mas quando o a diferença é calculado, eu fico 0 anos, 11 meses e 30 dias.
A menos que você mostrar o código como seu Data1 e Data2 são criadas as variáveis, não há nenhuma maneira real para contar.
(Você também está com vazamento de memória acima;sempre correspondem a uma alocação com um release
/autorelease
.E tente não dar a suas variáveis de capital de letras, pois, como uma questão de estilo, que deve ser feito apenas para nomes de classe)
Outras dicas
Finalmente encontrei o problema com a diferença de data, quando o salvava em um banco de dados, usei o timeInterValsent1970 com um valor duplo, mas ao preencher e configurá -lo em um datepicker, eu estava usando um tipo de coluna INT.
Obrigado Shaggy Frog por me dirigir na direção certa.