-(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];
}
Когда я звоню: [self endOfDay: [NSDate date]]; Я получаю первое число месяца ... Почему? Я использую эти два метода, потому что мне нужен интервал от первой секунды первой даты (beginOfDay: date1) до последней секунды второй даты (endOfDay: Date2) ...
ios
nsdate
nsdatecomponents
user1028028
источник
источник
Ответы:
Вы пропали
NSDayCalendarUnit
висточник
Начало дня / конец дня - Swift 4
источник
NSYearCalendarUnit
,NSMonthCalendarUnit
ИNSDayCalendarUnit
было устаревшим IOS 8. ИспользуйтеNSCalendarUnitYear
,NSCalendarUnitMonth
иNSCalendarUnitDay
вместо этого!Swift 5 Простой и точный ответ.
Время начала: 00:00:00
Конец: 23: 59: 59.5
Extra
источник
let dateAtEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())
?В iOS 8+ это действительно удобно; ты можешь сделать:
Чтобы получить конец дня, просто используйте методы NSCalendar в течение 23 часов, 59 минут, 59 секунд, в зависимости от того, как вы определяете конец дня.
Дата Математика
Документация Apple iOS NSCalendar . (См. Раздел: Календарные вычисления )
Методы NSCalendar, обсуждаемые NSHipster .
источник
Мои расширения Swift для NSDate:
Swift 1.2
Swift 2.0
источник
Swift 5.1 - XCode 11 с
Date
классом вместоNSDate
иCalender
вместоNSCalender
Использование:
источник
Date
когда пробую его на детской площадкеimport UIKit
?Вам не нужно обнулять компоненты, просто игнорируйте их:
источник
[calendar startOfDayForDate:date]
но-endOfDayForDate:
, к сожалению , их нет ...Для меня ни один из ответов здесь и еще где работал stackoverflow. Чтобы начать сегодня, я сделал это.
Обратите внимание на это
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
и[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
.Когда создается календарь, он инициализируется текущим часовым поясом, а когда дата извлекается из его компонентов, поскольку NSDate не имеет часового пояса, дата из текущего часового пояса считается часовым поясом UTC. Поэтому нам нужно установить часовой пояс перед извлечением компонентов, а затем при извлечении даты из этих компонентов.
источник
Swift 3
источник
Swift3 Использование * XCode8
Apple удаляет символ
NS
из имени класса, чтобы егоNSDate
можно было заменить наDate
. Вы можете получить предупреждение компилятора, если попытаетесь применить их, говоря, что они всегда будут терпеть неудачу, но они работают нормально, когда вы запускаете их на игровой площадке.Я заменил свою сгенерированную
NSDate
в основной модели данных на,Date
и они все еще работают.источник
В Swift 3 и выше
Использование:
источник
Еще один способ получить результат:
источник
Вам не хватает
NSDayCalendarUnit
компонентов.источник
Цель-C
источник
Для Swift 4
источник
Я думаю, что наиболее лаконичный способ сделать это в Swift выглядит следующим образом:
источник
Поскольку
iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
в Foundation есть встроенная функция, которую можно использовать «из коробки». Нет необходимости реализовывать собственные функции.public func startOfDay(for date: Date) -> Date
Итак, вы можете использовать это так:
let midnightDate = Calendar(identifier: .gregorian).startOfDay(for: Date())
Следует помнить, что здесь учитывается часовой пояс устройства. Вы можете установить
.timeZone
на ,calendar
если вы хотите иметь , например , зону UTC.Ссылка на справочные страницы Apple: https://developer.apple.com/reference/foundation/nscalendar/1417161-startofday .
источник
Еще один способ использования
dateInterval(of:start:interval:for:)
изCalendar
При возврате
startDate
содержит начало дня иinterval
количество секунд в дне.источник
Вот что я использую для Swift 4.2:
Для меня работает как оберег. Вы можете добавить это к расширению для дат начала и окончания
Date
, однако имейте в виду, что добавление расширения увеличивает время компиляции (если оно не находится в том же файле, что и класс), поэтому, если оно вам нужно только в одном месте или в одном классе. .. не используйте расширение.источник
источник
Просто для справки, простой способ установить начало и конец дня в Swift 4 ,
источник
Календарные единицы следует рассматривать как интервалы. Начиная с iOS 10
Calendar
есть несколько хороших методов для этогоВы можете использовать тот же метод, чтобы получить начало / конец любого компонента календаря (неделя / месяц / год и т. Д.)
источник
day?.end
оценивается как 00:00 завтра, а не до 23:59 сегодня.