【问题标题】:How to get NSDate for 00:00 on the day of [NSDate date]?如何在 [NSDate 日期] 当天 00:00 获取 NSDate?
【发布时间】:2012-06-21 07:40:21
【问题描述】:

我需要从 [NSDate 日期] 获取 00:00(一天的开始)的 NSDate 对象,假设当前是 11:30(由 [NSDate 日期] 返回),2012 年 1 月 6 日,现在我需要在 2012 年 1 月 6 日上午 00:00 有一个 NSDate。

我没有尝试过,但我的想法是:

NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
NSDate *morningStart = [calendar dateFromComponents:components];

所以我首先获取当前日期(比如说它是 01/06/2012),并为日期构造一个 NSDateComponent,然后我将小时/分钟/秒设置为 0,并且不应更改年/月/日(即 2012 年 1 月 6 日)然后我为此组件设置创建一个 NSDate,我可以获得 00:00:00 01/06/2012 的日期吗?

【问题讨论】:

  • 检查 poozolax 的答案。它要好得多,而且 100% 正确!

标签: iphone nsdate nscalendar nsdatecomponents


【解决方案1】:

你的做法是正确的,但是当你 NSLog 早上开始时,日期会以 GMT 时区显示

如果要确保日期正确,请将其转换为 NSString

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
 [formatter setDateFormat:@"yyyy-MMM-dd HH:mm:ss"];
 NSString *strFromDate = [formatter stringFromDate:morningStart]; // this will return 2012-Jun-21 00:00:00

【讨论】:

  • 感谢您的回答,但有什么区别?我只需要 NSDate,而不是 NSDate 的字符串。
  • 差异不会影响您的应用程序,无论何时记录 NSDate,它都会在 GMT 时区记录它,我添加 NSString 只是为了向您显示您的日期是正确的,但是您的 morningStart 日期是 100% 正确的它包含你真正想要的日期:)
【解决方案2】:

将 NSDate 转换为 NSString 可能会有所帮助,但如果您需要保留一个 NSDate 对象以进行进一步处理,这里是您的解决方案,将您的真正的 morningStart NSDate 对象设置为 00:00:00 时间,同时注意时区...正如您将看到的那样,您离解决方案并不远:

NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:now];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
int timeZoneOffset = [destinationTimeZone secondsFromGMTForDate:now] / 3600;
[components setHour:timeZoneOffset];
[components setMinute:0];
[components setSecond:0];
NSDate *morningStart = [calendar dateFromComponents:components];

【讨论】:

    【解决方案3】:

    在 iOS8 中使用 startOfDayForDate 很容易做到这一点:

    let date = NSDate() 
    let calendar = NSCalendar.currentCalendar(calendarIdentifier: NSGregorianCalendar)
    let dateAtStartOfDay = calendar.startOfDayForDate(date)
    

    或者您可以在 Swift 中以传统方式执行以下操作:

    let date = NSDate()
    let calendar = NSCalendar.currentCalendar(calendarIdentifier: NSGregorianCalendar)
    // Use a mask to extract the required components from today's date
    let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: date)
    let dateAtStartOfDay = calendar.dateFromComponents(components)!
    print(dateAtStartOfDay) 
    

    (注意: NSDates 是相对于 GMT 存储的。所以print 将显示相对本地时间。清楚地了解 TimeZone 对正确使用 NSDates 至关重要。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2021-09-19
      • 2013-05-08
      相关资源
      最近更新 更多