Estou tentando alcançar uma sincronização do dropBox e preciso comparar as datas de dois arquivos. Um está na minha conta dropBox e outro no meu iPhone.
Eu vim com o seguinte, mas obtenho resultados inesperados. Acho que estou fazendo algo fundamentalmente errado ao comparar as duas datas. Simplesmente usei os operadores>, mas acho que isso não é bom, pois estou comparando duas seqüências de caracteres NSDate. Aqui vamos nós:
NSLog(@"dB...lastModified: %@", dbObject.lastModifiedDate);
NSLog(@"iP...lastModified: %@", [self getDateOfLocalFile:@"NoteBook.txt"]);
if ([dbObject lastModifiedDate] < [self getDateOfLocalFile:@"NoteBook.txt"]) {
NSLog(@"...db is more up-to-date. Download in progress...");
[self DBdownload:@"NoteBook.txt"];
NSLog(@"Download complete.");
} else {
NSLog(@"...iP is more up-to-date. Upload in progress...");
[self DBupload:@"NoteBook.txt"];
NSLog(@"Upload complete.");
}
Isso me deu a seguinte saída (aleatória e errada):
2011-05-11 14:20:54.413 NotePage[6918:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:54.414 NotePage[6918:207] iP...lastModified: 2011-05-11 13:20:48 +0000
2011-05-11 14:20:54.415 NotePage[6918:207] ...db is more up-to-date.
ou este que está correto:
2011-05-11 14:20:25.097 NotePage[6903:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:25.098 NotePage[6903:207] iP...lastModified: 2011-05-11 13:19:45 +0000
2011-05-11 14:20:25.099 NotePage[6903:207] ...iP is more up-to-date.
iphone
objective-c
cocoa-touch
nsdate
deixa pra lá
fonte
fonte
Respostas:
Vamos assumir duas datas:
A seguinte comparação dirá qual é mais cedo / mais tarde / mesmo:
Consulte a documentação da classe NSDate para obter mais detalhes.
fonte
date1 -> date2
ascendente / descendente (e, portanto, date1 é posterior ou anterior, respectivamente).Tarde para a festa, mas outra maneira fácil de comparar objetos NSDate é convertê-los em tipos primitivos, o que permite o uso fácil de '>' '<' '==' etc
por exemplo.
timeIntervalSinceReferenceDate
converte a data em segundos desde a data de referência (1 de janeiro de 2001, GMT). ComotimeIntervalSinceReferenceDate
retorna um NSTimeInterval (que é um double typedef), podemos usar comparadores primitivos.fonte
(NSComparisonResult)compare:(NSDate *)
mas ainda bastante detalhado para esta operação simples ... (como de costume)[dateA timeIntervalSinceDate:dateB] > 0
No Swift, você pode sobrecarregar os operadores existentes:
Em seguida, você pode comparar NSDates diretamente com
<
,>
e==
(já suportado).fonte
{ ... }
NSDate
tem uma função de comparação.compare:
Retorna umNSComparisonResult
valor que indica a ordem temporal do receptor e outra data especificada.Parâmetros :
anotherDate
a data com a qual comparar o receptor. Este valor não deve ser nulo. Se o valor for nulo, o comportamento é indefinido e pode ser alterado nas versões futuras do Mac OS X.Valor de retorno:
NSOrderedSame
NSOrderedDescending
NSOrderedAscending
,.fonte
Você deseja usar os métodos NSDate compare :, laterDate :, previousDate: ou isEqualToDate:. O uso dos operadores <e> nessa situação está comparando os ponteiros, não as datas
fonte
Isso retorna o anterior do receptor e outroData. Se ambos são iguais, o receptor é retornado.
fonte
cDate = [aDate earlierDate:bDate]
entãocDate == aDate
ecDate == bDate
ambos podem ser verdadeiros. Encontrado esta fazendo algum trabalho data em iOS 8.-earlierDate:
(e-laterDate:
) não poderão retornar nem o receptor nem o argumento.Alguns utilitários de data, incluindo comparações em inglês, o que é bom:
A implementação:
fonte
Você deveria usar :
para comparar datas. Não há sobrecarga de operador no objetivo C.
fonte
Por que vocês não usam esses
NSDate
métodos de comparação:fonte
Eu encontrei quase a mesma situação, mas no meu caso eu estou verificando se o número de dias de diferença
Útil quando você precisa comparar o NSDate em dias / mês / ano
fonte
Você pode comparar duas datas por esse método também
fonte
Eu tentei, espero que funcione para você
fonte
Use esta função simples para comparação de datas
fonte