Ios 在swift中将NSDate设置为0秒

Ios 在swift中将NSDate设置为0秒,ios,swift,nsdate,nsdatepicker,Ios,Swift,Nsdate,Nsdatepicker,我试图从UIDatePicker获取NSDate,但它不断返回一个尾随20秒的日期时间。如何在swift中手动将NSDate的秒数设置为零?在swift中: var date = NSDate(); let timeInterval = floor(date .timeIntervalSinceReferenceDate() / 60.0) * 60.0 date = NSDate(timeIntervalSinceReferenceDate: timeInterval) 只需重新设置日期:

我试图从
UIDatePicker
获取
NSDate
,但它不断返回一个尾随20秒的日期时间。如何在swift中手动将NSDate的秒数设置为零?

在swift中:

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

只需重新设置日期:

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
}

将日期截断为一整分钟可以通过

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)
}

此方法可以很容易地调整为截断为一整小时、一天、一个月,

这是在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)!
在操场上工作:

用法:

let date1 = Date().zeroSeconds

let date2 = Date()
print(date2.zeroSeconds)
还有另一种方法,还有两个参数:和

要检查结果,请执行以下操作:

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

我知道这并不能直接解决
NSDate
,但无论如何它都是值得的-我对
Date
有着完全相同的问题,也因为我认为可能是一种更干净的方法

扩展日历{
///从“日期”中删除秒“Calendar.Component”。如果“removingFractional”为“true”,则它也会
///删除此特定“日期”中的所有小数秒。
///
///'removingFractional'默认为'true'。
func removingSeconds(fromDate日期:date,removingFractional removingFractional:Bool=true)->日期{
设秒=组件(.second,from:date)
让noSecondsDate=self.date(通过添加:.second,value:-seconds,to:date)
如果移除分数,则让noSecondsDate=noSecondsDate{
设纳秒=组件(.nanosecond,from:noSecondsDate)
返回self.date(通过添加:。纳秒,值:-纳秒,到:noSecondsDate)
}
返回条件
}
}

现在,为了解决您的问题,我们创建了函数
removingSeconds(fromDate:removingfractal)
。这真的很简单——正如您在函数的文档中看到的那样。它会删除
.second
组件,如果
removingfractive
true
,它还会删除该
日期可能具有的任何小数秒,或者
纳秒
组件。

我在swift中需要它,你可以在swift中使用相同的方法。这让我觉得是最好的方法。任何包含“
60
”的日期计算都会让我发抖!不要让我开始使用“
60*60
”甚至“
60*60*24
”!!如果要截断的
日期
具有完全相同的值,它是否总是“跳过”到下一个/上一个
日期
?@guilhermmatuella:没错,如果日期已经满一分钟,那么它将产生前一分钟。我已经删除了该部分,感谢您的反馈。请注意,这并没有删除分数秒,因此结果不一定是整分钟的。@MartinR我已经更新了解决方案,以处理可能需要考虑分数秒的情况。你认为现在这是一个不错的方法吗?好吧,你现在有了一个删除秒(包括小数秒)的方法。但拆除其他单位的目的是什么?请注意,
cal.removing(component:.day,fromDate:d)
为您提供上个月的最后一天,因为天数从1开始计算。例如,“2020-02-21 12:34”将变成“2020-01-31 12:34”。老实说,我不确定这是否有用。你完全正确。我已经删除了在任何
日历.Component
中使用的可能会导致混淆的抽象,该组件“大于”于
.second
-或与时间无关的任何内容。谢谢,我又一次改进了答案,使之更加直截了当。
import Foundation

let now = Date()
let calendar = Calendar.current
let date = calendar.date(bySettingHour: 0,
                         minute: 0,
                         second: 0,
                         of: now,
                         direction: .backward)
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