Подтвердить что ты не робот

NSDate вчера

Как создать объект NSDate с пользовательской датой, отличной от текущей даты? Например, я хотел бы создать var вчера или 2 дня назад.

4b9b3361

Ответ 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)

Ура!!!