-(NSDate *)beginningOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
return [cal dateFromComponents:components];
}
-(NSDate *)endOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:23];
[components setMinute:59];
[components setSecond:59];
return [cal dateFromComponents:components];
}
当我打电话:[self endOfDay:[NSDate date]];我得到了本月的第一天......为什么?我使用这两种方法,因为我需要一个从第一个日期的第一秒开始的间隔(beginningOfDay:date1)到第二个日期的最后一秒(endOfDay:Date2)......
17 回答
For swift 4
在iOS 8中,这非常方便;你可以做:
为了结束一天的结束,只需使用NSCalendar方法23小时59分59秒,具体取决于您如何定义一天的结束时间 .
Date Math
Apple iOS NSCalendar Documentation . (参见章节: Calendrical Calculations )
NSCalendar methods discussed by NSHipster .
Swift 4 简单而精确的答案 .
开始时间:00:00:00
结束时间:23:59:59.5
Objective-C
我对NSDate的Swift扩展:
Swift 1.2
Swift 2.0
您在组件中缺少
NSDayCalendarUnit
.您不必将组件设置为零,只需忽略它们:
对我来说,这里没有任何答案,否则stackoverflow工作的地方 . 为了开始今天,我做到了这一点 .
请注意
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
和[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
.创建日历时,它会使用当前时区进行初始化,并且从其组件中提取日期时,由于NSDate没有时区,因此从当前时区开始的日期将被视为UTC时区 . 因此,我们需要在提取组件之前设置时区,然后在从这些组件中提取日期时设置时区 .
自
iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
以来,基金会内置了一个内置功能,您可以直接使用它 . 无需实现自己的功能 .public func startOfDay(for date: Date) -> Date
所以你可以这样使用它:
let midnightDate = Calendar(identifier: .gregorian).startOfDay(for: Date())
值得记住的是,这需要考虑设备时区 . 如果您想拥有例如UTC区域,可以在
calendar
上设置.timeZone
.链接到Apple参考页面:https://developer.apple.com/reference/foundation/nscalendar/1417161-startofday .
只是使用
dateInterval(of:start:interval:for:)
Calendar
的另一种方式返回
startDate
包含当天的开始,interval
包含当天的秒数 .获得结果的另一种方法:
Swift 3
一天的开始/一天的结束 - 斯威夫特4
你错过了
NSDayCalendarUnit
inSwift 4.2 - XCode 10 与
Date
类而不是NSDate
和Calender
而不是NSCalender
用法:
Swift3 使用 *XCode8
Apple正在从类名中删除
NS
,以便NSDate
可以换出Date
. 如果你试图让他们说他们总是会失败,你可能会得到一个编译器警告,但是当他们在操场上运行它们时它们工作正常 .我用
Date
替换了我在核心数据模型中生成的NSDate
,它们仍然可以工作 .