Zastanawiam się, czy jest jakaś nowa i niesamowita możliwość uzyskania liczby dni między dwoma NSDates w Swift / „nowym” Cocoa?
Np. Jak w Rubim zrobiłbym:
(end_date - start_date).to_i
ios
swift
date
date-difference
Linus
źródło
źródło
Odpowiedzi:
Musisz również wziąć pod uwagę różnicę czasu. Na przykład, jeśli porównasz daty
2015-01-01 10:00
i2015-01-02 09:00
, dni między tymi datami zostaną zwrócone jako 0 (zero), ponieważ różnica między tymi datami jest mniejsza niż 24 godziny (to 23 godziny).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:
Wersja Swift 3 i Swift 4
źródło
calendar.date(bySettingHour: 12, minute: 00, second: 00, of: calendar.startOfDay(for: firstDate))
startOfDay()
wydaje się być niepotrzebne)calendar.date(bySettingHour: 12, minute: 0, second: 0, of: firstDate)
.Oto moja odpowiedź na Swift 2:
źródło
today
itomorrow
Widzę kilka odpowiedzi Swift3, więc dodam własne:
Nazewnictwo wydaje się bardziej szybkie, to jedna linia i przy użyciu najnowszej
dateComponents()
metody.źródło
Przetłumaczyłem moją odpowiedź Objective-C
wynik
Najtrudniejsze było to, że autouzupełnianie nalega, aby fromDate i toDate były
NSDate?
, ale w rzeczywistości muszą być takie,NSDate!
jak pokazano w pliku referencyjnym.Nie widzę, jak wyglądałoby dobre rozwiązanie z operatorem, ponieważ w każdym przypadku chcesz inaczej określić jednostkę. Możesz zwrócić przedział czasowy, ale niewiele zyskasz.
źródło
.DayCalendarUnit
to, że jest przestarzały. Uważam, że teraz powinieneś użyć.CalendarUnitDay
zamiast tego.let components = cal.components(.Day, fromDate: startDate, toDate: endDate, options: [])
.Day
terazOto bardzo ładne
Date
rozszerzenie, aby uzyskać różnicę między datami w latach, miesiącach, dniach, godzinach, minutach, sekundachźródło
date
powinny znajdować sięsinceDate
w parametrach funkcji.days
i działa dobrze.func years(since date: Date) -> Int? { return Calendar.current.dateComponents[.year], from: date, to: self).years }
i możesz to nazwać jakolet y = date1.years(since: date2)
. To może być bardziej spójne z nowoczesnymi konwencjami nazewnictwa.Aktualizacja dla Swift 3 iOS 10 Beta 4
źródło
Oto odpowiedź na Swift 3 (testowany pod kątem IOS 10 Beta)
Wtedy możesz to tak nazwać
źródło
Swift 3. Podziękowania dla Emin Buğra Saral powyżej za
startOfDay
sugestię.Stosowanie:
źródło
Elementy wbudowane w szybkość są nadal bardzo podstawowe. Tak jak powinni być na tym wczesnym etapie. Ale możesz dodawać własne rzeczy z ryzykiem, które wiąże się z przeciążeniem operatorów i funkcji domeny globalnej. Będą jednak lokalne dla twojego modułu.
źródło
Oto moja odpowiedź na Swift 3:
źródło
Nie ma jeszcze żadnej standardowej biblioteki specyficznej dla języka Swift; tylko podstawowe typy liczbowe, łańcuchowe i kolekcjonerskie.
Jest całkowicie możliwe zdefiniowanie takich skrótów za pomocą rozszerzeń, ale jeśli chodzi o rzeczywiste gotowe interfejsy API, nie ma „nowego” Cocoa; Swift po prostu mapuje bezpośrednio do tych samych starych, pełnych funkcji API Cocoa, które już istnieją.
źródło
Dodam swoją wersję, mimo że ten wątek ma już rok. Mój kod wygląda tak:
Mam nadzieję, że to komuś pomoże.
Twoje zdrowie,
źródło
Metoda Erin została zaktualizowana do Swift 3, pokazuje dni od dzisiaj (bez względu na porę dnia)
źródło
Zwraca to bezwzględną różnicę w dniach między niektórymi
Date
a dzisiejszymi:a następnie użyj go:
źródło
Możesz użyć następującego rozszerzenia:
Następnie możesz to nazwać tak:
źródło
Swift 3.2
źródło
Cała odpowiedź jest dobra. Ale w przypadku lokalizacji musimy obliczyć liczbę dni dziesiętnych między dwiema datami. dzięki czemu możemy zapewnić trwały format dziesiętny.
źródło
Następnie użyj tego jak
źródło
To jest zaktualizowana wersja odpowiedzi Emin dla Swift 5, która zawiera sugestię, aby użyć południa zamiast północy jako ostatecznego czasu porównywania dni. Obsługuje również potencjalną awarię różnych funkcji daty, zwracając opcjonalny.
źródło
Swift 3 - dni od dziś do daty
Wywołaj taką funkcję
źródło
łatwiejszą opcją byłoby utworzenie rozszerzenia w dniu
źródło
jeśli potrzebujesz rok, miesiąc, dni i godziny jako ciąg znaków, użyj tego
var tomorrow = Calendar.current.date (byAdding: .day, value: 1, to: Date ())!
let dc = tomorrow.completeOffset (from: Date ())
źródło
Ładna, poręczna jedna wkładka:
źródło
źródło
Rozwiązanie Swift 5.2.4:
źródło
Wersja 2017, kopiuj i wklej
źródło
źródło