Как создать объект NSDate
с пользовательской датой, отличной от текущей даты? Например, я хотел бы создать var вчера или 2 дня назад.
NSDate вчера
Ответ 1
Для расчета дат следует использовать 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 для получения дополнительной информации.
Но я бы посоветовал не делать никаких ручных настроек объектов даты, настраивая их на некоторый интервал времени, который кратен секундам в день (например, 24 * 60 * 60). Этот метод работает отлично, если вы просто добавляете некоторый интервал времени, но для расчета даты вы действительно хотите использовать объект календаря, чтобы избежать проблем, связанных с летней экономией и т.п.
Ответ 2
Это решение для Swift 5.1 - XCode 11
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date())
Соответственно два дня назад:
let twoDaysAgo = Calendar.current.date(byAdding: .day, value: -2, to: Date())
Ответ 3
Код для 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
}
Ответ 4
Ответ Роба отлично работает. Если вы сильно используете такие вычисления, вы можете даже инкапсулировать эту логику и создать свои собственные пользовательские расширения и обертки.
Это говорит, что я предлагаю взглянуть также на эту фантастическую библиотеку под названием 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)
- И многое другое...
Надеюсь, что это поможет.
Ответ 5
let twoDaysAgo = NSDate(timeIntervalSinceNow: -2*24*60*60)
Ответ 6
Пожалуйста, попробуйте ввести код ниже. Я думаю, это просто.
let today = NSDate()
let tomorrow = today.dateByAddingTimeInterval(24 * 60 * 60)
let yesterday = today.dateByAddingTimeInterval(-24 * 60 * 60)
Ура!!!