-(NSDate *)beginningOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
return [cal dateFromComponents:components];
}
-(NSDate *)endOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:23];
[components setMinute:59];
[components setSecond:59];
return [cal dateFromComponents:components];
}
Kiedy dzwonię: [self endOfDay: [NSDate date]]; Dostaję pierwszy dzień miesiąca ... Dlaczego tak jest? Używam tych dwóch metod, ponieważ potrzebuję interwału, który jest od pierwszej sekundy pierwszej daty (początek dnia: data1) do ostatniej sekundy drugiej daty (koniec dnia: data2) ...
ios
nsdate
nsdatecomponents
user1028028
źródło
źródło
Odpowiedzi:
Brakuje
NSDayCalendarUnit
wźródło
Początek / koniec dnia - Swift 4
źródło
NSYearCalendarUnit
,NSMonthCalendarUnit
INSDayCalendarUnit
został wycofany z iOS 8. użytkowaniaNSCalendarUnitYear
,NSCalendarUnitMonth
iNSCalendarUnitDay
zamiast tego!Szybki 5 Prosta i dokładniejsza odpowiedź.
Godzina rozpoczęcia: 00:00:00
Godzina zakończenia: 23: 59: 59,5
Dodatkowy
źródło
let dateAtEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())
?W iOS 8+ jest to naprawdę wygodne; możesz to zrobić:
Aby uzyskać koniec dnia, po prostu używaj metod NSCalendar przez 23 godziny, 59 minut, 59 sekund, w zależności od tego, jak zdefiniujesz koniec dnia.
Date Math
Dokumentacja Apple iOS NSCalendar . (Zobacz rozdział: Obliczenia kalendarze )
Metody NSCalendar omówione przez NSHipster .
źródło
Moje rozszerzenia Swift dla NSDate:
Swift 1.2
Swift 2.0
źródło
Swift 5.1 - XCode 11 z
Date
klasą zamiastNSDate
iCalender
zamiastNSCalender
Stosowanie:
źródło
Date
kiedy próbuję go na placu zabawimport UIKit
?Nie musisz ustawiać komponentów na zero, po prostu je zignoruj:
źródło
[calendar startOfDayForDate:date]
ale-endOfDayForDate:
niestety nie ma ...Dla mnie żadna z odpowiedzi tutaj i gdzie indziej nie działała na stackoverflow. Aby zacząć dzisiaj, zrobiłem to.
Zwróć uwagę na to
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
i[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
.Kiedy kalendarz jest tworzony, jest inicjowany z aktualną strefą czasową, a kiedy data jest pobierana z jego składników, ponieważ NSDate nie ma strefy czasowej, data z bieżącej strefy czasowej jest uważana za strefę czasową UTC. Musimy więc ustawić strefę czasową przed wyodrębnieniem komponentów i później podczas wyodrębniania daty z tych komponentów.
źródło
Szybki 3
źródło
Swift3 Korzystanie z * XCode8
Apple usuwa
NS
z nazwy klasy, abyNSDate
można ją było zamienić naDate
. Możesz otrzymać ostrzeżenie kompilatora, jeśli spróbujesz je przesłać, mówiąc, że zawsze się nie uda, ale działają dobrze, gdy uruchomisz je na placu zabaw.Zastąpiłem wygenerowany
NSDate
w rdzeniu model danychDate
i nadal działają.źródło
W wersji Swift 3 i nowszych
Stosowanie:
źródło
Jeszcze jeden sposób na uzyskanie wyniku:
źródło
Brakuje Ci
NSDayCalendarUnit
składników.źródło
Cel C
źródło
Dla szybkiego 4
źródło
Myślę, że najbardziej zwięzły sposób na zrobienie tego w Swift jest następujący:
źródło
Ponieważ
iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
w Fundacji jest wbudowana funkcja, z której można korzystać po wyjęciu z pudełka. Nie ma potrzeby wdrażania własnych funkcji.public func startOfDay(for date: Date) -> Date
Możesz więc użyć tego w ten sposób:
let midnightDate = Calendar(identifier: .gregorian).startOfDay(for: Date())
Warto pamiętać, że uwzględnia to strefę czasową urządzenia. Można ustawić
.timeZone
nacalendar
jeśli chcesz mieć np Strefa czasowa UTC.Łącze do stron referencyjnych firmy Apple: https://developer.apple.com/reference/foundation/nscalendar/1417161-startofday .
źródło
Tylko inny sposób korzystania
dateInterval(of:start:interval:for:)
zCalendar
Po powrocie
startDate
zawiera początek dnia iinterval
liczbę sekund w ciągu dnia.źródło
Oto, czego używam w Swift 4.2:
U mnie działa jak urok. Możesz dodać to do rozszerzenia dla dat początkowych i końcowych w dniu
Date
, jednak pamiętaj, że dodanie rozszerzenia wydłuża czas kompilacji (chyba że w tym samym pliku co klasa), więc jeśli potrzebujesz go tylko w jednym miejscu lub w jednej klasie. .. nie używaj rozszerzenia.źródło
źródło
Tylko w celach informacyjnych, prosty sposób na ustawienie początku i końca dnia w Swift 4 ,
źródło
Jednostki kalendarza należy traktować jako interwały. Od iOS 10
Calendar
ma kilka fajnych metod na toMożesz użyć tej samej metody, aby uzyskać początek / koniec dowolnego elementu kalendarza (tydzień / miesiąc / rok itp.)
źródło
day?.end
ewaluuje do godziny 12:00 jutro, a nie dzisiaj do 23:59.