Próbuję osiągnąć synchronizację DropBox i muszę porównać daty dwóch plików. Jeden jest na moim koncie dropBox, a drugi na moim iPhonie.
Wymyśliłem następujące, ale otrzymuję nieoczekiwane wyniki. Wydaje mi się, że robię coś zasadniczo nie tak, porównując dwie daty. Po prostu użyłem operatorów> <, ale myślę, że to nie jest dobre, ponieważ porównuję dwa ciągi NSDate. No to ruszamy:
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.");
}
To dało mi następujące (losowe i nieprawidłowe) dane wyjściowe:
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.
lub ten, który okazuje się być poprawny:
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
nieważne
źródło
źródło
Odpowiedzi:
Załóżmy dwie daty:
Następnie poniższe porównanie pokaże, które jest wcześniejsze / późniejsze / takie same:
Więcej informacji znajduje się w dokumentacji klasy NSDate .
źródło
date1 -> date2
rosnącej / malejącej (i dlatego data1 jest późniejsza lub wcześniejsza).Późno na imprezę, ale innym łatwym sposobem porównywania obiektów NSDate jest konwersja ich na prymitywne typy, co pozwala na łatwe użycie „>” „<” „==” itp.
na przykład.
timeIntervalSinceReferenceDate
konwertuje datę na sekundy od daty odniesienia (1 stycznia 2001 r., GMT). GdytimeIntervalSinceReferenceDate
zwraca NSTimeInterval (który jest podwójnym typedef), możemy użyć prymitywnych komparatorów.źródło
(NSComparisonResult)compare:(NSDate *)
ale wciąż dość gadatliwy dla tej prostej operacji ... (jak zwykle)[dateA timeIntervalSinceDate:dateB] > 0
W Swift możesz przeciążać istniejących operatorów:
Następnie można porównać NSDates bezpośrednio
<
,>
oraz==
(już obsługiwane).źródło
{ ... }
NSDate
ma funkcję porównania.compare:
ZwracaNSComparisonResult
wartość wskazującą czasowe uporządkowanie odbiornika i inną podaną datę.Parametry :
anotherDate
data, z którą należy porównać odbiornik. Ta wartość nie może wynosić zero. Jeśli wartość wynosi zero, zachowanie jest niezdefiniowane i może ulec zmianie w przyszłych wersjach systemu Mac OS X.Zwracana wartość:
NSOrderedSame
NSOrderedDescending
NSOrderedAscending
.źródło
Chcesz użyć metod porównania NSDate :, laterDate :, wcześniejData :, lub isEqualToDate: metody. Używanie operatorów <i> w tej sytuacji polega na porównywaniu wskaźników, a nie dat
źródło
Zwraca wcześniejszy odbiornik i inną datę. Jeśli oba są takie same, zwracany jest odbiornik.
źródło
cDate = [aDate earlierDate:bDate]
wtedycDate == aDate
icDate == bDate
oba mogą być prawdą. Znalazłem to, pracując nad datą na iOS 8.-earlierDate:
(i-laterDate:
) nie mogą zwrócić ani odbiornika, ani argumentu.Niektóre narzędzia daty, w tym porównania W JĘZYKU ANGIELSKIM, co jest miłe:
Implementacja:
źródło
Powinieneś użyć :
porównać daty. W celu C nie występuje przeciążenie operatora
źródło
Dlaczego nie zastosujecie tych
NSDate
metod porównywania:źródło
Spotkałem prawie taką samą sytuację, ale w moim przypadku sprawdzam, czy liczba dni różni się
Przydatne, gdy trzeba porównać NSDate w jednostce Dni / Miesiąc / Rok
źródło
Możesz także porównać dwie daty tą metodą
źródło
Próbowałem, mam nadzieję, że to zadziała
źródło
Użyj tej prostej funkcji do porównania dat
źródło