11

我试图从中获取NSDateUIDatePicker但它不断返回我一个日期时间,后缀为 20 秒。如何NSDate快速手动将秒设置为零?

4

7 回答 7

36
extension Date {

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

}

用法:

let date1 = Date().zeroSeconds

let date2 = Date()
print(date2.zeroSeconds)
于 2017-07-13T06:05:33.787 回答
10

从Swift 中的这个答案:

var date = NSDate();
let timeInterval = floor(date .timeIntervalSinceReferenceDate() / 60.0) * 60.0
date = NSDate(timeIntervalSinceReferenceDate: timeInterval)
于 2015-04-22T06:33:02.210 回答
7

这就是在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)!

在操场上工作: 从日期中删除秒组件

于 2016-12-05T12:19:27.090 回答
6

可以将日期截断为整分钟

let date = NSDate()

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

Swift 4及更高版本的更新:

let date = Date()
let cal = Calendar.current
if let fullMinute = cal.dateInterval(of: .minute, for: date)?.start {
    print(fullMinute)
}

这种方法可以很容易地适应截断为一个完整的小时、天、月……

于 2015-04-22T07:29:24.543 回答
1

只需重新格式化日期:

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
}
于 2015-04-22T07:16:19.833 回答
0
import Foundation

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

还有另一种方法,还有两个参数:matchingpolicyrepeatTimePolicy

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
于 2019-03-26T23:29:30.370 回答
0

我知道这不能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组件,如果removingFractionaltrue,它还删除它Date可能具有的任何小数秒 - 或.nanosecond组件。

于 2020-02-13T13:40:30.243 回答