Próbuję uzyskać różnicę między aktualną datą, jak NSDate()
i datę z PHP time();
zaproszenia na przykład: NSDate(timeIntervalSinceReferenceDate: 1417147270)
. Jak mogę uzyskać różnicę czasu między dwiema datami. Chciałbym mieć funkcję, która porównuje dwie daty, a if(seconds > 60)
następnie zwraca minuty, if(minutes > 60)
godziny if(hours > 24)
zwrotu i dni powrotu itd.
Jak mam to zrobić?
EDYCJA: Akceptowana obecnie odpowiedź zrobiła dokładnie to, co chciałem zrobić. Polecam to dla łatwego użycia, aby uzyskać czas między dwiema datami w formie, której time()
używa funkcja PHP . Jeśli nie jesteś szczególnie zaznajomiony z PHP, jest to czas w sekundach od 1 stycznia 1970 roku. Jest to korzystne dla backendu w PHP. Jeśli używasz backendu, takiego jak NodeJS, możesz rozważyć inne opcje, które znajdziesz poniżej.
NSDateComponentsFormatter
. Jest bardzo konfigurowalny, co pozwala uzyskać odpowiednio zwięzłe wyniki (np.maximumUnitCount = 1
.).Odpowiedzi:
Xcode 8.3 • Swift 3.1 lub nowszy
Możesz użyć Kalendarza, aby pomóc Ci utworzyć rozszerzenie, aby wykonać obliczenia daty w następujący sposób:
Korzystanie z formatera składników daty
źródło
.CalendarUnitSecond
daje błąd'NSCalendarUnit.Type' does not have a member named 'CalendarUnitSecond'
, czy wiesz jak go rozwiązać?NSCalendarUnit
, zaimplementowanej jakoreturn Calendar.current().components(unit, from: date, to: self, options: [])?. valueForComponent(unit)
(w iOS> 8).DateComponentsFormatter
jest O wiele lepsze niż robienie tego na dłuższą metę, to naprawdę powinno być na górze odpowiedzi.Jeśli ktoś musi wyświetlić wszystkie jednostki czasu, np. „Godziny minuty sekundy”, a nie tylko „godziny”. Powiedzmy, że różnica czasu między dwiema datami wynosi 1 godzinę 59 minut 20 sekund. Ta funkcja wyświetli „1h 59m 20s”.
Oto mój kod Objective-C:
W Swift 3+:
źródło
Ty pytasz:
Zakładam, że próbujesz zbudować ciąg reprezentujący upływ czasu między dwiema datami. Zamiast pisać własny kod, Apple ma już klasę zaprojektowaną właśnie do tego. Mianowicie, użyj
DateComponentsFormatter
, ustawallowedUnits
na dowolne wartości, które mają sens dla twojej aplikacji, ustawunitsStyle
na cokolwiek chcesz (np..full
), A następnie zadzwoństring(from:to:)
.Np. W Swift 3:
Spowoduje to również zlokalizowanie ciągu odpowiedniego dla danego urządzenia.
Lub w Swift 2.3:
Jeśli szukasz rzeczywistych wartości liczbowych, po prostu użyj
dateComponents
. Np. W Swift 3:Lub w Swift 2.3:
źródło
połączone rozszerzenie + DateComponentsFormatter z odpowiedzi @ leo-dabus
Xcode 8.3 • Swift 3.1
źródło
źródło
Dodałem „długą” wersję do odpowiedzi Leo Dabusa na wypadek, gdybyś chciał napisać coś w stylu „2 tygodnie temu” zamiast po prostu „2w” ...
źródło
-> Użyj tego, aby znaleźć odstęp czasu między dwiema datami w Swift (z dwoma ciągami).
źródło
Nieznacznie zmodyfikowany kod dla Swift 3.0
źródło
Swift 5.1 • iOS 13
Możesz użyć RelativeDateFormatter , który został wprowadzony przez Apple w iOS 13.
Zobacz Jak wyświetlić względną datę i godzinę za pomocą RelativeDateTimeFormatter .
źródło
Jeśli Twoim celem jest uzyskanie dokładnej liczby dni między dwiema datami, możesz obejść ten problem w następujący sposób:
źródło
W Swift 3, w zależności od potrzeb, możesz wybrać jeden z dwóch poniższych sposobów rozwiązania problemu.
1. Wyświetl różnicę między dwiema datami dla użytkownika
Możesz użyć a,
DateComponentsFormatter
aby utworzyć ciągi interfejsu aplikacji.DateComponentsFormatter
mamaximumUnitCount
właściwość z następującą deklaracją:Ustawiając
maximumUnitCount
wartość na1
, masz gwarancję wyświetlenia różnicy tylko w jednejDateComponentsFormatter
jednostce (lata, miesiące, dni, godziny lub minuty).Poniższy kod placu zabaw pokazuje, jak wyświetlić różnicę między dwiema datami:
Zauważ, że
DateComponentsFormatter
zaokrągla wynik. Dlatego różnica 4 godzin i 30 minut zostanie wyświetlona jako 5 godzin .Jeśli musisz powtórzyć tę operację, możesz zmienić kod:
2. Uzyskaj różnicę między dwiema datami bez formatowania
Jeśli nie musisz wyświetlać z formatowaniem różnicy między dwiema datami dla użytkownika, możesz użyć
Calendar
.Calendar
ma metodę,dateComponents(_:from:to:)
która ma następującą deklarację:Poniższy kod placu zabaw, który używa,
dateComponents(_:from:to:)
pokazuje, jak odzyskać różnicę między dwiema datami, zwracając różnicę tylko w jednym typieCalendar.Component
(lata, miesiące, dni, godziny lub minuty).Jeśli musisz powtórzyć tę operację, możesz zmienić kod:
źródło
W Swift 2.2
źródło
Mały dodatek do odpowiedzi Leo Dabusa, aby zapewnić liczbę mnogą i być bardziej czytelnym dla człowieka.
Szybki 3
źródło
To jest krótsza wersja: Zasadniczo próbuję uzyskać różnicę między datownikiem postu a
Date()
teraz.źródło
Oto moja odpowiedź na powyższe odpowiedzi Swift 3. To jest aktualne na listopad 2016, wydanie Xcode było 8.2 Beta (8C23). Użyłem niektórych z powyższych sugestii Sagar i Emin i czasami musiał pozwolić Xcode na autouzupełnianie, aby zasugerować składnię. Wyglądało na to, że składnia została naprawdę zmieniona na tę wersję beta.
buyDate
Dostałem od DatePicker:źródło
NSCalendar
w Swift 3. UżyjCalendar
. To jest uproszczone dolet calendar = Calendar.current
. I wtedycomponents
będzie wyglądać następująco:let components = calendar.dateComponents([.day], from: date1, to: date2)
.W przypadku XCode w wersji 8.3.3 i Swift 3.0:
źródło
Niektóre dodatki w odpowiedzi na pytanie jose920405 w celu zapewnienia zgodności z Swift 3.0 i nowszymi wersjami
źródło
Użyj tego kodu:
Wyjście to: Wynik: 10 lat 1 miesiąc i 18 dni
źródło
Posługiwać się:
źródło