Установите NSDate 0 секунд в быстром

Я пытаюсь получить NSDate от UIDatePicker, но он постоянно возвращает мне дату и трейлинг 20 секунд. Как я могу установить вручную NSDateвторой с нуля в быстром?

5 ответов

Решение

Из этого ответа в Swift:

var date = NSDate();
let timeInterval = floor(date .timeIntervalSinceReferenceDate() / 60.0) * 60.0
date = NSDate(timeIntervalSinceReferenceDate: timeInterval)
extension Date {

    var zeroSeconds: Date? {
        get {
            let calender = Calendar.current
            let dateComponents = calender.dateComponents([.year, .month, .day, .hour, .minute], from: self)
            return calender.date(from: dateComponents)
        }
    }

}

Использование:

let date1 = Date().zeroSeconds

let date2 = Date()
print(date2.zeroSeconds)

Усечение даты до полной минуты может быть сделано с

let date = NSDate()

let cal = NSCalendar.currentCalendar()
var fullMinute : NSDate?
cal.rangeOfUnit(.CalendarUnitMinute, startDate: &fullMinute, interval: nil, forDate: date)
println(fullMinute!)

На iOS 8 это может быть еще проще сделать с

let fullMinute = cal.nextDateAfterDate(date, matchingUnit: .CalendarUnitSecond,
                      value: 0,
                      options: .MatchNextTime | .SearchBackwards)!
println(fullMinute)

Оба метода могут быть легко адаптированы для усечения до полного часа, дня, месяца, ...

Вот как это сделать в Swift 3.

В этом примере я удаляю секунды в компонентах даты:

let date = picker.date
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: date)
let fullMinuteDate = calendar.date(from: components)!

Работаем на детской площадке: Удаление компонента секунд из даты

Просто переформатируйте дату:

func stripSecondsFromDate(date: NSDate) -> NSDate {
  let dateFormatter = NSDateFormatter()
  dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
  let str = dateFormatter.stringFromDate(date)
  let newDate = dateFormatter.dateFromString(str)!

  return newDate
}

Я знаю, что это не адрес NSDate напрямую, но это может стоить в любом случае - у меня была точно такая же проблема с Dateа также потому, что я думаю, что это может быть более чистый подход.

extension Calendar {
    /// Removes seconds `Calendar.Component` from a `Date`. If `removingFractional` is `true`, it also
    /// removes all fractional seconds from this particular `Date`.
    ///
    /// `removingFractional` defaults to `true`.
    func removingSeconds(fromDate date: Date, removingFractional removesFractional: Bool = true) -> Date? {
        let seconds = component(.second, from: date)
        let noSecondsDate = self.date(byAdding: .second, value: -seconds, to: date)

        if removesFractional, let noSecondsDate = noSecondsDate {
            let nanoseconds = component(.nanosecond, from: noSecondsDate)
            return self.date(byAdding: .nanosecond, value: -nanoseconds, to: noSecondsDate)
        }

        return noSecondsDate
    }
}

Теперь, чтобы решить вашу проблему, мы создали функцию removingSeconds(fromDate: removingFractional). Это действительно просто - как вы можете видеть в документации к функции. Удаляет.second компонент и, если removingFractional является true, он также удаляет любые доли секунды, которые Date может иметь - или .nanosecond составная часть.

import Foundation

let now = Date()
let calendar = Calendar.current
let date = calendar.date(bySettingHour: 0,
                         minute: 0,
                         second: 0,
                         of: now,
                         direction: .backward)

Есть еще один способ, с двумя дополнительными параметрами: matchpolicy и repeatTimePolicy.

let date = calendar.date(bySettingHour: 0,
                         minute: 0,
                         second: 0,
                         of: now,
                         matchingPolicy: .strict,
                         repeatedTimePolicy: .first,
                         direction: .backward)

Чтобы проверить результат:

let formatter = ISO8601DateFormatter()
formatter.timeZone = TimeZone.current // defaults to GMT
let string = formatter.string(from: date!)
print(string) // 2019-03-27T00:00:00+01:00
Другие вопросы по тегам