2014-11-15 4 views
38

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

ответ

-2
let twoDaysAgo = NSDate(timeIntervalSinceNow: -2*24*60*60) 
+0

Справедливо, особенно для интервалов более сложных, чем дней. – microtherion

+1

Это решение не учитывает DST. – Andriy

+0

@Andriy, true, как @Rob указал в комментарии после удаления. Тем не менее, это зависит от того, что вам нужно для NSDate. Иногда что-то простое, как указано выше, и иногда решение «NSCalendar» не совсем корректно: «Два дня назад» может означать «не то же самое время» позавчера ». – microtherion

67

Для того, чтобы рассчитать сроки, Вы должны использовать 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). Этот метод работает отлично, если вы просто добавляете некоторый интервал времени, но для расчета даты вы действительно хотите использовать объект календаря, чтобы избежать проблем, связанных с летней экономией и т. П.

+0

DayCalendarUnit устарел в OS X версии 10.10. –

+0

вы должны изменить его на .CalendarUnitDay –

+0

let twoDaysAgo = NSCalendar.currentCalendar(). DateByAddingUnit (.CalendarUnitDay, значение: -2, toDate: NSDate(), опции: nil) –

-4

Пожалуйста, попробуйте ввести код. Я думаю, это просто.

let today = NSDate() 
let tomorrow = today.dateByAddingTimeInterval(24 * 60 * 60) 
let yesterday = today.dateByAddingTimeInterval(-24 * 60 * 60) 

Cheers !!!

2

Код для 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 
} 
2

Ответ Роба работает. Если вы сильно используете такие вычисления, вы можете даже инкапсулировать эту логику и создать свои собственные пользовательские расширения и обертки.

Было сказано, что я также предложу взглянуть на эту фантастическую библиотеку под названием 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)
  • и А много больше ...

Надеюсь, это поможет.

+0

Спасибо, что указали мне на SwiftDate! – penner

19

Это решение для Swift 4 - XCode 9

let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date()) 
+1

замените 'NSCalendar' на' Calendar' – zero3nna

Смежные вопросы