-(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];
}
Quand j'appelle: [self endOfDay: [NSDate date]]; Je reçois le premier du mois ... Pourquoi ça? J'utilise ces deux méthodes car j'ai besoin d'un intervalle qui va de la première seconde de la première date (beginOfDay: date1) à la dernière seconde de la deuxième date (endOfDay: Date2) ...
ios
nsdate
nsdatecomponents
user1028028
la source
la source
Réponses:
Vous manquez
NSDayCalendarUnit
dansla source
Début / Fin de journée - Swift 4
la source
NSYearCalendarUnit
,NSMonthCalendarUnit
EtNSDayCalendarUnit
ont été OBSOLETE iOS 8. UtilisezNSCalendarUnitYear
,NSCalendarUnitMonth
et à laNSCalendarUnitDay
place!Swift 5 Réponse simple et plus précise.
Heure de début: 00:00:00
Heure de fin: 23: 59: 59.5
Supplémentaire
la source
let dateAtEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())
?Dans iOS 8+, c'est vraiment pratique; tu peux faire:
Pour obtenir la fin de la journée, utilisez simplement les méthodes NSCalendar pendant 23 heures, 59 minutes, 59 secondes, selon la façon dont vous définissez la fin de la journée.
Date Math
Documentation Apple iOS NSCalendar . (Voir la section: Calculs calendaires )
Méthodes NSCalendar discutées par NSHipster .
la source
Mes extensions Swift pour NSDate:
Swift 1.2
Swift 2.0
la source
Swift 5.1 - XCode 11 avec
Date
classe au lieu deNSDate
etCalender
au lieu deNSCalender
Usage:
la source
Date
lorsque je l'essaye dans la cour de récréationimport UIKit
?Vous n'avez pas besoin de mettre les composants à zéro, ignorez-les simplement:
la source
[calendar startOfDayForDate:date]
mais il n'y-endOfDayForDate:
en a malheureusement pas ...Pour moi, aucune des réponses ici et ailleurs sur stackoverflow n'a fonctionné. Pour commencer aujourd'hui, je l'ai fait.
Notez ceci
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
et[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
.Lorsqu'un calendrier est créé, il est initialisé avec le fuseau horaire actuel et lorsque la date est extraite de ses composants, puisque NSDate n'a pas de fuseau horaire, la date du fuseau horaire actuel est considérée comme le fuseau horaire UTC. Nous devons donc définir le fuseau horaire avant d'extraire les composants et plus tard lors de l'extraction de la date de ces composants.
la source
Swift 3
la source
Swift3 Utilisation de * XCode8
Apple supprime le
NS
du nom de classe afin qu'ilNSDate
puisse être remplacé parDate
. Vous pouvez recevoir un avertissement du compilateur si vous essayez de les lancer en disant qu'ils échoueront toujours, mais ils fonctionnent bien lorsque vous les exécutez dans la cour de récréation.J'ai remplacé mon
NSDate
modèle de données de base généré parDate
et ils fonctionnent toujours.la source
Dans Swift 3 et supérieur
Usage:
la source
Une autre façon d'obtenir le résultat:
la source
Vous manquez
NSDayCalendarUnit
dans les composants.la source
Objectif c
la source
Pour Swift 4
la source
Je pense que la façon la plus succincte de le faire dans Swift est la suivante:
la source
Puisqu'il
iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
y a une fonction intégrée dans la Fondation, que vous pouvez utiliser directement. Pas besoin d'implémenter ses propres fonctions.public func startOfDay(for date: Date) -> Date
Vous pouvez donc l'utiliser de cette façon:
let midnightDate = Calendar(identifier: .gregorian).startOfDay(for: Date())
Il convient de se rappeler que cela prend en compte le fuseau horaire de l'appareil. Vous pouvez régler
.timeZone
surcalendar
si vous voulez avoir par exemple la zone UTC.Lien vers les pages de référence Apple: https://developer.apple.com/reference/foundation/nscalendar/1417161-startofday .
la source
Juste une autre façon à l' aide
dateInterval(of:start:interval:for:)
deCalendar
Au retour
startDate
contient le début de la journée etinterval
le nombre de secondes dans la journée.la source
Voici ce que j'utilise pour Swift 4.2:
Fonctionne comme un charme pour moi. Vous pouvez l'ajouter à une extension pour les dates de début et de fin le
Date
, mais gardez à l'esprit que l'ajout d'une extension augmente le temps de compilation (sauf dans le même fichier que la classe), donc si vous n'en avez besoin qu'à un seul endroit ou dans une classe. .. n'utilisez pas d'extension.la source
la source
Juste pour référence, un moyen simple de définir le début et la fin de la journée dans Swift 4 ,
la source
Les unités de calendrier doivent être considérées comme des intervalles. À partir d'iOS 10, il
Calendar
existe de bonnes méthodes pour celaVous pouvez utiliser la même méthode, pour obtenir le début / la fin de n'importe quel composant du calendrier (semaine / mois / année, etc.)
la source
day?.end
évalue à 12:00 AM demain, pas 23:59 PM ce soir.