【问题标题】:get current date from [NSDate date] but set the time to 10:00 am从 [NSDate date] 获取当前日期,但将时间设置为上午 10:00
【发布时间】:2011-08-02 11:15:31
【问题描述】:

如何重置从 [NSDate date] 检索到的当前日期,然后将时间更改为早上 10:00。

【问题讨论】:

    标签: iphone ipad nsdate


    【解决方案1】:

    与所有日期操作一样,您必须使用 NSDateComponentsNSCalendar

    NSDate *now = [NSDate date];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian];
    NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:now];
    [components setHour:10];
    NSDate *today10am = [calendar dateFromComponents:components];
    

    Apple 在 iOS8 中引入了一种省去几行代码的便捷方法:

    NSDate *d = [calendar dateBySettingHour:10 minute:0 second:0 ofDate:[NSDate date] options:0];
    

    斯威夫特:

    let calendar: NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    let now: NSDate! = NSDate()
    
    let date10h = calendar.dateBySettingHour(10, minute: 0, second: 0, ofDate: now, options: NSCalendarOptions.MatchFirst)!
    

    【讨论】:

    • 你为什么不使用 [NSCalendar currentCalendar] ?这将使代码更加通用。
    • 请注意,NSYearCalendarUnit、NSMonthCalendarUnit 和 NSDayCalendarUnit 已弃用。请改为使用 NSCalendarUnitYear、NSCalendarUnitMonth 和 NSCalendarUnitDay。否则我们可能会得到一些垃圾日期值。
    • 注意:在我设置日历的区域设置和时区之前,这对我不起作用。
    • @kraftydevil 你能告诉我,你是如何提供语言环境和时区的吗?
    【解决方案2】:

    这个nsdate 使用了不同的格式:

    NSDateFormatter *format = [[NSDateFormatter alloc] init];
    [format setDateFormat:@"MMM dd, yyyy HH:mm"];
    
    NSDate *now = [[NSDate alloc] init];
    
    NSString *dateString = [format stringFromDate:now];
    
    NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
    [inFormat setDateFormat:@"MMM dd, yyyy"];
    
    NSDate *parsed = [inFormat dateFromString:dateString]; 
    

    【讨论】:

    • 您实际上并没有回答这个问题,但无论如何我发现它非常有用:谢谢。 :)
    【解决方案3】:
    NSDate *currentDate = [NSDate date];
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setHour:10];
    NSDate *date = [gregorian dateByAddingComponents:comps toDate:currentDate  options:0];
    [comps release];
    

    虽然没有在 xcode 中测试过 :)

    【讨论】:

    • 那行不通。您正在将当前日期和时间增加 10 小时,而不是将时间设置为 10:00。
    • 对不起,我误解了这个问题,@flucchtpunkt 的答案似乎是正确的
    【解决方案4】:

    我刚刚用 Matthias Bauch 的回答设置了时区,它对我有用。否则它会增加 18:30 分钟。

    let cal: NSCalendar = NSCalendar.currentCalendar()
    cal.timeZone = NSTimeZone(forSecondsFromGMT: 0)
    let newDate: NSDate = cal.dateBySettingHour(1, minute: 0, second: 0, ofDate: NSDate(), options: NSCalendarOptions())!
    

    【讨论】:

      【解决方案5】:

      您可以将此方法用于任何分钟/小时/时段(又名上午/下午)组合:

      - (NSDate *)todayModifiedWithHours:(NSString *)hours
                                 minutes:(NSString *)minutes
                               andPeriod:(NSString *)period
      {
          NSDate *todayModified = NSDate.date;
      
          NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
      
          NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSMinuteCalendarUnit fromDate:todayModified];
      
          [components setMinute:minutes.intValue];
      
          int hour = 0;
      
          if ([period.uppercaseString isEqualToString:@"AM"]) {
      
              if (hours.intValue == 12) {
                  hour = 0;
              }
              else {
                  hour = hours.intValue;
              }
          }
          else if ([period.uppercaseString isEqualToString:@"PM"]) {
      
              if (hours.intValue != 12) {
                  hour = hours.intValue + 12;
              }
              else {
                  hour = 12;
              }
          }
          [components setHour:hour];
      
          todayModified = [calendar dateFromComponents:components];
      
          return todayModified;
      }
      

      请求示例:

      NSDate *todayAt10AM = [self todayModifiedWithHours:@"10"
                                                 minutes:@"00"
                                               andPeriod:@"am"];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多