今天午夜如何获得NSDate对象?

mar*_*son 59 cocoa-touch objective-c nsdate

获取表示当天午夜的NSDate对象的最有效方法是什么?

Ric*_*ble 98

iOS 8中的新API

iOS 8在NSCalendar上包含一个名为startOfDayForDate的新方法,它非常易于使用:

let startOfToday = NSCalendar.currentCalendar().startOfDayForDate(NSDate())
Run Code Online (Sandbox Code Playgroud)

Apple的描述:

此API返回给定日期的第一个时刻日期.例如,如果您想要"今天"的开头,请传入[NSDate日期].如果有两个中午,则返回第一个.如果没有,则返回确实存在的第一个时刻.

关于时区的更新:

由于startOfDayForDate是NSCalendar上的一种方法,因此它使用NSCalendar的时区.所以,如果我想知道它在纽约的时间,今天在洛杉矶开始,我可以这样做:

let losAngelesCalendar = NSCalendar.currentCalendar().copy() as! NSCalendar
losAngelesCalendar.timeZone = NSTimeZone(name: "America/Los_Angeles")!

let dateTodayBeganInLosAngeles = losAngelesCalendar.startOfDayForDate(NSDate())
dateTodayBeganInLosAngeles.timeIntervalSince1970

let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .MediumStyle
dateFormatter.timeStyle = .ShortStyle
dateFormatter.timeZone = NSTimeZone(name: "America/New_York")!
let timeInNewYorkWhenTodayBeganInLosAngeles = dateFormatter.stringFromDate(dateTodayBeganInLosAngeles)
print(timeInNewYorkWhenTodayBeganInLosAngeles) // prints "Jul 29, 2015, 3:00 AM"
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,特别是对于iOS 8及更高版本. (4认同)
  • @ftvs,我用更多关于时区的信息更新了我的答案. (2认同)

Chr*_*orr 65

试试这个:

NSDate *const date = NSDate.date;
NSCalendar *const calendar = NSCalendar.currentCalendar;
NSCalendarUnit const preservedComponents = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay);
NSDateComponents *const components = [calendar components:preservedComponents fromDate:date];
NSDate *const normalizedDate = [calendar dateFromComponents:components];
Run Code Online (Sandbox Code Playgroud)

  • 这不就是我告诉你的吗? (4认同)
  • 从iOS 8开始,组件现在是NSCalendarUnitYear,NSCalendarUnitMonth和NSCalendarUnitDay,以防任何人获得弃用警告. (3认同)
  • 这是我的观点.`NSLog(@"%@",date);`正在向它发送`-description`消息,它基本上与`NSLog`将它发送到控制台.如果您确实询问其日期为"NSHourCalendarUnit",您会看到它是午夜日期. (2认同)

asl*_*nci 12

NSCalendar *cal = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
[cal setTimeZone:[NSTimeZone systemTimeZone]];  

 NSDateComponents * comp = [cal components:( NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:[NSDate date]]; 

 [comp setMinute:0]; 
 [comp setHour:0];
 [comp setSecond:0]; 

 NSDate *startOfToday = [cal dateFromComponents:comp]; 
Run Code Online (Sandbox Code Playgroud)

如果您指的是午夜时间为23:59,则将组件的小时设置为23,将分钟设置为59.


Ale*_*ciu 8

您可以使用以下方法获取NSDate的午夜值.

- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate
{
    // Use the user's current calendar and time zone
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
    [calendar setTimeZone:timeZone];

    // Selectively convert the date components (year, month, day) of the input date
    NSDateComponents *dateComps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:inputDate];

    // Set the time components manually
    [dateComps setHour:0];
    [dateComps setMinute:0];
    [dateComps setSecond:0];

    // Convert back       
    NSDate *beginningOfDay = [calendar dateFromComponents:dateComps];
    return beginningOfDay;
}
Run Code Online (Sandbox Code Playgroud)

Thkis取自这里的网站.


fuj*_*471 8

迅速:

let cal = NSCalendar.currentCalendar()

//tip:NSCalendarUnit can be omitted, but with the presence of it, you can take advantage of Xcode's auto-completion
var comps = cal.components(NSCalendarUnit.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit | .HourCalendarUnit | .MinuteCalendarUnit | .SecondCalendarUnit, fromDate: NSDate()) 
comps.hour = 0
comps.minute = 0
comps.second = 0

let midnightOfToday = cal.dateFromComponents(comps)!
Run Code Online (Sandbox Code Playgroud)

Swift 2.2:

let cal = NSCalendar.currentCalendar()

let comps = cal.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: NSDate())
comps.hour = 0
comps.minute = 0
comps.second = 0

let midnightOfToday = cal.dateFromComponents(comps)!
Run Code Online (Sandbox Code Playgroud)

Objective-C的:

NSCalendar *cal = [NSCalendar currentCalendar]; 

NSDateComponents *comps = [cal components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:[NSDate date]];    
[comps setHour:0]; 
[comps setMinute:0]; 
[comps setSecond:0];

NSDate *midnightOfToday = [cal dateFromComponents:comps];
Run Code Online (Sandbox Code Playgroud)


joa*_*oan 5

从 iOS8 开始,您可以使用 startDayForDate。

因此,为了开始今天的工作(目标 -C):

NSDate * midnight;
 midnight = [[NSCalendar currentCalendar] startOfDayForDate: [NSDate date]];
Run Code Online (Sandbox Code Playgroud)