-(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];
}
Cuando llamo: [self endOfDay: [NSDate date]]; Me sale el primero del mes ... ¿Por qué? Utilizo estos dos métodos porque necesito un intervalo que va desde el primer segundo de la primera fecha (beginOfDay: date1) hasta el último segundo de la segunda fecha (endOfDay: Date2) ...
ios
nsdate
nsdatecomponents
usuario1028028
fuente
fuente
Respuestas:
Te falta
NSDayCalendarUnit
enfuente
Inicio / Fin del día - Swift 4
fuente
NSYearCalendarUnit
,NSMonthCalendarUnit
YNSDayCalendarUnit
se han de utilizarse a partir de iOS 8. UsoNSCalendarUnitYear
,NSCalendarUnitMonth
yNSCalendarUnitDay
en su lugar!Swift 5 Respuesta simple y más precisa.
Hora de inicio: 00:00:00
Hora de finalización: 23: 59: 59.5
Extra
fuente
let dateAtEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())
?En iOS 8+, esto es realmente conveniente; tu puedes hacer:
Para obtener el final del día, simplemente use los métodos NSCalendar durante 23 horas, 59 minutos, 59 segundos, dependiendo de cómo defina el final del día.
Matemáticas de fecha
Documentación de NSCalendar de Apple iOS . (Consulte la sección: Cálculos calendáricos )
Métodos NSCalendar discutidos por NSHipster .
fuente
Mis extensiones Swift para NSDate:
Swift 1.2
Swift 2.0
fuente
Swift 5.1 - XCode 11 con
Date
clase en lugar deNSDate
y enCalender
lugar deNSCalender
Uso:
fuente
Date
cuando lo intento en el patio de recreoimport UIKit
?No tiene que configurar los componentes a cero, simplemente ignórelos:
fuente
[calendar startOfDayForDate:date]
pero no hay-endOfDayForDate:
, desafortunadamente ...Para mí, ninguna de las respuestas aquí y en otros lugares en stackoverflow funcionó. Para empezar hoy hice esto.
Tenga en cuenta esto
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
y[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
.Cuando se crea un calendario, se inicializa con la zona horaria actual y cuando se extrae la fecha de sus componentes, dado que NSDate no tiene zona horaria, la fecha de la zona horaria actual se considera como zona horaria UTC. Por lo tanto, debemos establecer la zona horaria antes de extraer los componentes y más tarde al extraer la fecha de estos componentes.
fuente
Swift 3
fuente
Swift3 Uso * XCode8
de Apple es la eliminación de la
NS
del nombre de la clase de manera queNSDate
se pueden intercambiar aDate
. Es posible que reciba una advertencia del compilador si intenta lanzarlos diciendo que siempre fallarán, pero funcionan bien cuando los ejecuta en el patio de recreo.Reemplacé mi
NSDate
modelo de datos centrales generados conDate
y todavía funcionan.fuente
En Swift 3 y superior
Uso:
fuente
Una forma más de obtener resultados:
fuente
Falta
NSDayCalendarUnit
en los componentes.fuente
C objetivo
fuente
Para rápido 4
fuente
Creo que la forma más sucinta de hacer esto en Swift es la siguiente:
fuente
Dado que
iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
hay una función incorporada en la Fundación, que puede usar de inmediato. No es necesario implementar funciones propias.public func startOfDay(for date: Date) -> Date
Entonces puedes usarlo de esta manera:
let midnightDate = Calendar(identifier: .gregorian).startOfDay(for: Date())
Vale la pena recordar que esto toma en consideración la zona horaria del dispositivo. Se puede establecer
.timeZone
encalendar
si usted quiere tener por ejemplo la zona UTC.Enlace a las páginas de referencia de Apple: https://developer.apple.com/reference/foundation/nscalendar/1417161-startofday .
fuente
Sólo otra manera el uso
dateInterval(of:start:interval:for:)
deCalendar
A la vuelta
startDate
contiene el inicio del día yinterval
el número de segundos del día.fuente
Esto es lo que uso para Swift 4.2:
Funciona como un encanto para mí. Puede agregar esto a una extensión para las fechas de inicio y finalización
Date
, sin embargo, tenga en cuenta que agregar una extensión aumenta el tiempo de compilación (a menos que esté en el mismo archivo que la clase), por lo que si solo lo necesita en un lugar o en una clase. .. no use una extensión.fuente
fuente
Solo como referencia, una forma sencilla de configurar el inicio y el final del día en Swift 4 ,
fuente
Las unidades de calendario deben considerarse intervalos. A partir de iOS 10
Calendar
tiene algunos buenos métodos para estoPuede usar el mismo método para obtener el inicio / final de cualquier componente del calendario (semana / mes / año, etc.)
fuente
day?.end
evalúa a las 12:00 a. m. de mañana, no a las 11:59 p. m. de esta noche.