2016-09-14 2 views
0

Я работаю над приложением ios в swift, и у меня есть ползунок с 7 вариантами. Каждый вариант представляет конкретную дату.как я могу рассчитать конкретные даты в Swift (используя NSDate)

Пока мой код выглядит следующим образом:

func convertValueToDate(value: Float) -> NSDate{ 

    var currentDate:NSDate = NSDate() 

    switch(value){ 
    case 1: 
     print("5 years ago") 
     return NSDate() 
    case 2: 
     print("one year ago") 
     return NSDate() 
    case 3: 
     print("six months ago") 
     return NSDate() 
    case 4: 
     print("one month ago") 
     return NSDate() 
    case 5: 
     print("one week ago") 
     return NSDate() 
    case 6: 
     print("yesterday") 
     return NSDate() 
    case 7: 
     print("today") 
     return NSDate() 
    default: 
     print("default date") 
     return NSDate() 
    } 
} 

, как вы можете видеть выше - напечатать в консоли, что я хочу вернуться. Но вместо печати я хочу вернуть эти даты в формате NSDate. Я не знаю, как рассчитать время каждого варианта, потому что я хочу иметь час 0:00:01 AM каждый день. Так, например. когда пользователь ставит номер 7 Я хочу вернуть ему точную дату вчерашнего 0:00:01 AM. Когда пользователь выбирает номер 5 Я хочу дать ему дату неделю назад со временем 0:00:01 AM и так далее. Как я могу рассчитать его, чтобы эта функция всегда возвращала мне время 0:00:01 AM и рассчитанную дату?

ответ

1

Вы можете использовать метод NSCalendar dateByAddingUnit:

func convertValueToDate(value: Float) -> NSDate { 
    struct Cal { 
     static let iso8601 = NSCalendar(identifier: NSCalendarIdentifierISO8601)! 
    } 
    let now = NSDate() 
    print("now: ", now) 
    switch(value) { 
    case 1: 
     print("5 years ago") 
     return Cal.iso8601.dateByAddingUnit(.Year, value: -5, toDate: now, options: [])! 
    case 2: 
     print("one year ago") 
     return Cal.iso8601.dateByAddingUnit(.Year, value: -1, toDate: now, options: [])! 
    case 3: 
     print("six months ago") 
     return Cal.iso8601.dateByAddingUnit(.Month, value: -6, toDate: now, options: [])! 
    case 4: 
     print("one month ago") 
     return Cal.iso8601.dateByAddingUnit(.Month, value: -1, toDate: now, options: [])! 
    case 5: 
     print("one week ago") 
     return Cal.iso8601.dateByAddingUnit(.WeekOfYear, value: -1, toDate: now, options: [])! 
    case 6: 
     print("yesterday") 
     return Cal.iso8601.dateByAddingUnit(.Day, value: -1, toDate: now, options: [])! 
    case 7: 
     print("today") 
     return now 
    default: 
     print("default date") 
     return now 
    } 
} 

, если вам нужно возвратить начало дня для этой даты вы можете использовать метод NSCalendar startOfDayForDate.

func convertValueToDate(value: Float) -> NSDate { 
    struct Cal { 
     static let iso8601 = NSCalendar(identifier: NSCalendarIdentifierISO8601)! 
    } 
    let now = NSDate() 
    print("now: ", now) 
    let result: NSDate 
    switch(value) { 
    case 1: 
     print("5 years ago") 
     result = Cal.iso8601.dateByAddingUnit(.Year, value: -5, toDate: now, options: [])! 
    case 2: 
     print("one year ago") 
     result = Cal.iso8601.dateByAddingUnit(.Year, value: -1, toDate: now, options: [])! 
    case 3: 
     print("six months ago") 
     result = Cal.iso8601.dateByAddingUnit(.Month, value: -6, toDate: now, options: [])! 
    case 4: 
     print("one month ago") 
     result = Cal.iso8601.dateByAddingUnit(.Month, value: -1, toDate: now, options: [])! 
    case 5: 
     print("one week ago") 
     result = Cal.iso8601.dateByAddingUnit(.WeekOfYear, value: -1, toDate: now, options: [])! 
    case 6: 
     print("yesterday") 
     result = Cal.iso8601.dateByAddingUnit(.Day, value: -1, toDate: now, options: [])! 
    case 7: 
     print("today") 
     result = now 
    default: 
     print("default date") 
     result = now 
    } 
    return Cal.iso8601.startOfDayForDate(result) 
} 
+0

Спасибо за ваш ответ! Точно так же метод 'startOfDayForDate' фактически приносит мне« 0:00:01 AM »данного дня? Я сделал это для теста: 'print (now) print (Cal.iso8601.startOfDayForDate (сейчас))' и напечатал два значения: '2016-09-14 22:34:07 + 0000' и' 2016-09- 14 22:00:00 + 0000' почему второе значение - '22: 00: 00' вместо' 0: 00: 01'? – user3766930

+0

Зачем вам нужна 1 секунда? дата правильная, не беспокойтесь о дате печати UTC время –

+0

Я думал, что требуется 1 секунда, так как мне нужно начало дня, а '0: 00: 00' относится к предыдущему дню и' 0:00: 01' к текущему – user3766930

0

Здесь раствор в Swift 3, так как она уже здесь (для Swift 2.x добавив NS префикс перед классами должны сделать трюк):

import Foundation 

func convertValueToDate(value: Float) -> Date{ 

    let calendar = Calendar.current 
    let currentDate = calendar.date(bySettingHour: 00, minute: 00, second: 01, of: Date())! 

    func dateByAdding(_ value: Int, _ component: Calendar.Component) -> Date { 
     return calendar.date(byAdding: component, value: value, to: currentDate)! 
    } 

    switch(value){ 
    case 1: 
     print("5 years ago") 
     return dateByAdding(-5, .year) 
    case 2: 
     print("one year ago") 
     return dateByAdding(-1, .year) 
    case 3: 
     print("six months ago") 
     return dateByAdding(-6, .month) 
    case 4: 
     print("one month ago") 
     return dateByAdding(-1, .month) 
    case 5: 
     print("one week ago") 
     return dateByAdding(-7, .day) 
    case 6: 
     print("yesterday") 
     return dateByAdding(-1, .day) 
    case 7: 
     print("today") 
     return currentDate 
    default: 
     print("default date") 
     return currentDate 
    } 
} 
+0

Не каждая дата имеет 12am, так что это может привести к сбою вашего приложения –

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