Как создать объект NSDate
с пользовательской датой, отличной от текущей даты? Например, я хотел бы создать var вчера или 2 дня назад.NSDate вчера
ответ
let twoDaysAgo = NSDate(timeIntervalSinceNow: -2*24*60*60)
Для того, чтобы рассчитать сроки, Вы должны использовать NSCalendar
. Например, в Swift 3 даты за два дня до сегодняшнего дня является:
let calendar = Calendar.current
let twoDaysAgo = calendar.date(byAdding: .day, value: -2, to: Date())
Или в Swift 2:
let calendar = NSCalendar.currentCalendar()
let twoDaysAgo = calendar.dateByAddingUnit(.Day, value: -2, toDate: NSDate(), options: [])
Или, чтобы получить первое число месяца, вы можете получить на следующий день, месяц и год с текущей даты, отрегулируйте день до первого месяца, а затем создайте новый объект даты. В Swift 3:
var components = calendar.dateComponents([.year, .month, .day], from: Date())
components.day = 1
let firstOfMonth = calendar.date(from: components)]
Или в Swift 2:
let components = calendar.components([.Year, .Month, .Day], fromDate: NSDate())
components.day = 1
let firstOfMonth = calendar.dateFromComponents(components)
Есть много полезных функций в классе NSCalendar
/Calendar
, так что вы должны исследовать, что дальше. См. NSCalendar class reference для получения дополнительной информации.
Но я бы посоветовал не выполнять ручную корректировку объектов даты, отрегулировав его на некоторый интервал времени, который кратен секундам в день (например, 24 * 60 * 60). Этот метод работает отлично, если вы просто добавляете некоторый интервал времени, но для расчета даты вы действительно хотите использовать объект календаря, чтобы избежать проблем, связанных с летней экономией и т. П.
DayCalendarUnit устарел в OS X версии 10.10. –
вы должны изменить его на .CalendarUnitDay –
let twoDaysAgo = NSCalendar.currentCalendar(). DateByAddingUnit (.CalendarUnitDay, значение: -2, toDate: NSDate(), опции: nil) –
Пожалуйста, попробуйте ввести код. Я думаю, это просто.
let today = NSDate()
let tomorrow = today.dateByAddingTimeInterval(24 * 60 * 60)
let yesterday = today.dateByAddingTimeInterval(-24 * 60 * 60)
Cheers !!!
Код для Swift 2.0
static func yesterDay() -> NSDate {
let today: NSDate = NSDate()
let daysToAdd:Int = -1
// Set up date components
let dateComponents: NSDateComponents = NSDateComponents()
dateComponents.day = daysToAdd
// Create a calendar
let gregorianCalendar: NSCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
let yesterDayDate: NSDate = gregorianCalendar.dateByAddingComponents(dateComponents, toDate: today, options:NSCalendarOptions(rawValue: 0))!
return yesterDayDate
}
Ответ Роба работает. Если вы сильно используете такие вычисления, вы можете даже инкапсулировать эту логику и создать свои собственные пользовательские расширения и обертки.
Было сказано, что я также предложу взглянуть на эту фантастическую библиотеку под названием SwiftDate. Даже если вы не используете его, README стоит прочитать. Он вводит определение или Region
, что может быть очень полезно для некоторых сценариев и некоторых удобных инициализаторов.
Некоторые прохладные питания и образцы:
- арифметической операции с датами:
(1.years - 2.hours + 16.minutes).fromNow()
- Составление компоненты время:
let dateInUTC = (2015.years | 12.months | 25.days | 20.hours | 10.minutes).inUTCRegion
- Классный:
let date = 5.days.fromNow
,let date = 4.hours.ago
- с регионами:
let date = (6.hours + 2.minutes).fromNow(region: inRome)
- и А много больше ...
Надеюсь, это поможет.
Спасибо, что указали мне на SwiftDate! – penner
Это решение для Swift 4 - XCode 9
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date())
замените 'NSCalendar' на' Calendar' – zero3nna
- 1. NSDate: Получение значения для будущего или Вчера
- 2. Узнайте, есть ли NSDate сегодня, вчера, завтра
- 3. Разработка «Сегодня» и «Вчера» от NSDate?
- 4. Сравнить NSDate на сегодня или вчера
- 5. Фильтр массива NSDate для Сегодня, вчера для построения
- 6. Swift - Как проверить, соответствует ли NSDate вчера текущее время?
- 7. NSDate константа для Fetch Predicate
- 8. scp files from вчера
- 9. MySQL Получить вчера контент
- 10. Получить вчера от simpledataformat
- 11. Вчера sql call
- 12. Ошибки компилятора ... прошло вчера?
- 13. Установка Вчера Jquery DatePicker
- 14. ASP Вчера Дата
- 15. Вчера Grails в критериях
- 16. Получить вчера время PHP
- 17. PHP: дата «Вчера», «Сегодня»
- 18. Mysql Выбрать вчера значения
- 19. Вчера время в PHP
- 20. Сравнение NSDate с [NSDate date]
- 21. Преобразование описания NSDate в NSDate?
- 22. Swift NSDate и печать (NSDate)
- 23. NSDate-интервалы за вчерашний день
- 24. Переход вчера с даты строки
- 25. ВЫБРАТЬ между сегодня и вчера
- 26. определить вар сегодня и вчера
- 27. Linq выбрать где дата вчера
- 28. SQL Server: условие 3PM вчера
- 29. Выберите вчера дату в MySQL
- 30. Ограничения вчера с определенным временем
Справедливо, особенно для интервалов более сложных, чем дней. – microtherion
Это решение не учитывает DST. – Andriy
@Andriy, true, как @Rob указал в комментарии после удаления. Тем не менее, это зависит от того, что вам нужно для NSDate. Иногда что-то простое, как указано выше, и иногда решение «NSCalendar» не совсем корректно: «Два дня назад» может означать «не то же самое время» позавчера ». – microtherion