-(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];
}
Quando eu ligo: [self endOfDay: [NSDate date]]; Recebo o primeiro dia do mês ... Por que isso? Eu uso esses dois métodos porque preciso de um intervalo que vai do primeiro segundo da primeira data (startOfDay: date1) até o último segundo da segunda data (endOfDay: Date2) ...
ios
nsdate
nsdatecomponents
user1028028
fonte
fonte
Respostas:
Você está faltando
NSDayCalendarUnit
emfonte
Início do dia / fim do dia - Swift 4
fonte
NSYearCalendarUnit
,NSMonthCalendarUnit
ENSDayCalendarUnit
foram obsoleto a partir do iOS 8. UseNSCalendarUnitYear
,NSCalendarUnitMonth
eNSCalendarUnitDay
em vez disso!Swift 5 Resposta simples e mais precisa.
Horário de início: 00:00:00
Horário de término: 23: 59: 59,5
Extra
fonte
let dateAtEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())
?No iOS 8+, isso é muito conveniente; você pode fazer:
Para obter o final do dia, basta usar os métodos NSCalendar por 23 horas, 59 minutos e 59 segundos, dependendo de como você define o final do dia.
Date Math
Documentação do Apple iOS NSCalendar . (Consulte a Seção: Cálculos Calendáricos )
Métodos NSCalendar discutidos por NSHipster .
fonte
Minhas extensões Swift para NSDate:
Swift 1.2
Swift 2.0
fonte
Swift 5.1 - XCode 11 com
Date
classe em vez deNSDate
e emCalender
vez deNSCalender
Uso:
fonte
Date
quando tento no playgroundimport UIKit
?Você não precisa configurar os componentes para zero, apenas ignore-os:
fonte
[calendar startOfDayForDate:date]
mas não há-endOfDayForDate:
, infelizmente ...Para mim, nenhuma das respostas aqui e em outros lugares onde o stackoverflow funcionou. Para começar hoje eu fiz isso.
Observe isso
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
e[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
.Quando um calendário é criado, ele é inicializado com o fuso horário atual e quando a data é extraída de seus componentes, uma vez que NSDate não tem fuso horário, a data do fuso horário atual é considerada como fuso horário UTC. Portanto, precisamos definir o fuso horário antes de extrair os componentes e posteriormente ao extrair a data desses componentes.
fonte
Swift 3
fonte
Swift3 usando * XCode8 A
Apple está removendo o
NS
do nome da classe para queNSDate
possa ser trocado paraDate
. Você pode receber um aviso do compilador se tentar lançá-los dizendo que eles sempre falharão, mas eles funcionam bem quando você os executa no playground.Substituí meu
NSDate
modelo de dados gerado no núcleo porDate
e eles ainda funcionam.fonte
Em Swift 3 e superior
Uso:
fonte
Mais uma maneira de obter resultados:
fonte
Você está faltando
NSDayCalendarUnit
nos componentes.fonte
Objective-C
fonte
Para Swift 4
fonte
Acho que a maneira mais sucinta de fazer isso no Swift é a seguinte:
fonte
Uma vez que
iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
existe uma função incorporada na Fundação, que você pode usar fora da caixa. Não há necessidade de implementar funções próprias.public func startOfDay(for date: Date) -> Date
Então, você pode usá-lo desta forma:
let midnightDate = Calendar(identifier: .gregorian).startOfDay(for: Date())
Vale lembrar que isso leva em consideração o fuso horário do dispositivo. Você pode definir
.timeZone
sobrecalendar
se você quer ter por exemplo zona UTC.Link para as páginas de referência da Apple: https://developer.apple.com/reference/foundation/nscalendar/1417161-startofday .
fonte
Apenas uma outra maneira utilizando
dateInterval(of:start:interval:for:)
deCalendar
No retorno,
startDate
contém o início do dia einterval
o número de segundos do dia.fonte
Isso é o que eu uso para o Swift 4.2:
Funciona como um encanto para mim. Você pode adicionar isso a uma extensão para as datas de início e término em
Date
, no entanto, lembre-se de que adicionar uma extensão aumenta o tempo de compilação (a menos que no mesmo arquivo da classe), portanto, se você só precisar dela em um lugar ou em uma classe. .. não use uma extensão.fonte
fonte
Apenas para referência, uma maneira simples de definir o início e o fim do dia no Swift 4 ,
fonte
As unidades de calendário devem ser consideradas intervalos. A partir do iOS 10
Calendar
tem alguns métodos interessantes para issoVocê pode usar o mesmo método para obter o início / fim de qualquer componente do calendário (semana / mês / ano etc.)
fonte
day?.end
avalia para 0h de amanhã, não para 23h59 hoje à noite.