【问题标题】:iPhone OS: How do I create an NSDate for a specific date?iPhone OS:如何为特定日期创建 NSDate?
【发布时间】:2010-04-05 17:10:40
【问题描述】:

看起来很简单,但我似乎找不到方法。

很高兴看到几种不同的方法。

【问题讨论】:

    标签: ios cocoa-touch nsdate nsdateformatter nscalendar


    【解决方案1】:

    @Chuck 的回答是正确的,并引导我使用以下代码。想我会分享:

    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setDay:10];
    [comps setMonth:10];
    [comps setYear:2010];
    NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
    

    【讨论】:

    • 注意还有setHoursetMinutesetSecond等,粒度更细。
    【解决方案2】:

    你可以用这个

    NSString *dateString = @"03-Sep-11";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"dd-MMM-yy";
    NSDate *date = [dateFormatter dateFromString:dateString];
    

    希望对你有所帮助。

    【讨论】:

    • 小心使用“dateFromString”函数——我发现对于一些完全有效的日期,它会失败得很惨。有关解析日期字符串的另一种方法,请参阅下面的帖子。
    • Oded Ben 提到的方式也是另一个最好的方式..... NSDateComponents *comps = [[NSDateComponents alloc] init]; [comps setDay:10]; [comps setMonth:10]; [comps setYear:2010]; NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
    【解决方案3】:

    如果您谈论的是特定日历日期而不是 UNIXy 日期,您可能需要 NSCalendar 的 dateFromComponents:

    【讨论】:

      【解决方案4】:

      Swift 示例

      示例通常是最简单的学习方法。下面是几个例子。

      现在

      这个是最简单的。

      let currentDateTime = Date()
      

      2017 年 2 月 20 日

      // Specify date components
      var dateComponents = DateComponents()
      dateComponents.year = 2017
      dateComponents.month = 2
      dateComponents.day = 20
      
      // Create date from components
      let userCalendar = Calendar.current // user calendar
      let dateThisPostWasUpdated = userCalendar.date(from: dateComponents)
      

      1976 年 4 月 1 日

      // Specify date components
      var dateComponents = DateComponents()
      dateComponents.year = 1976
      dateComponents.month = 4
      dateComponents.day = 1
      
      // Create date from components
      let userCalendar = Calendar.current // user calendar
      let appleFoundedDate = userCalendar.date(from: dateComponents)
      

      需要更多细节...?

      还有其他方法可以创建日期。如果你想了解这些,以及如何显示日期,那么see my fuller answer

      【讨论】:

        【解决方案5】:

        请参阅NSDate 的文档。您可以使用NSDateFormatterdateFromString: 方法或NSCalendardateFromComponents: 方法。

        【讨论】:

        • 当使用字符串中的日期时,我不断得到这个日期:“1969-12-31 16:00:00”-0800
        • NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; NSDate *capturedStartDate = [dateFormatter dateFromString: @"Jan 2, 2001"]; NSLog(@"%@", [capturedStartDate 描述]);输出:2010-04-05 10:49:47.688 Calendar2[21339:207] 1969-12-31 16:00:00 -0800
        • 也许您需要在格式化的日期上设置一些参数,而不是普通的init
        【解决方案6】:

        我在寻找这个问题的答案时发现了这个线程,但后来我在我的 Big Nerd Ranch Objective-C 编程书中找到了一个很好的例子。归功于他们,而不是我。

          NSDateComponents *myBDay  =[[NSDateComponents alloc] init];
            [myBDay setDay:22];
            [myBDay setMonth: 04];
            [myBDay setYear: 1984];
            [myBDay setHour:9];
            [myBDay setMinute:25];
            [myBDay setSecond:35];
        
            NSCalendar *g = [[ NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
            NSDate *dateOfBirth = [g dateFromComponents:myBDay];
        

        【讨论】:

          【解决方案7】:

          这很荒谬,不是吗?

          2013 年中和 Apple仍然没有提供设置 NSDate 值的简单方法。

          在我当前的 iPad 项目中,我不敢相信我不得不暂停一段时间来编写自己的帮助程序类来从 NSDate 中获取 Year 值。我的意思是,来吧,这是基本的东西。

          无论如何,这是我在项目中使用的帮助类,用于将字符串转换为 NSDate 值:

          @implementation DateHelper
          
          +(NSDate*)parseDateString:(NSString *)dateString
          {
              NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
              [rfc3339TimestampFormatterWithTimeZone setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
              [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"MMM dd, yyyy"];
          
              NSDate *theDate = nil;
              NSError *error = nil;
              if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
                  NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
              }
          
              return theDate;
          }
          
          @end
          

          使用此代码,您可以使用以下内容设置 NSDate 值:

          NSDate* date = [DateHelper parseDateString:@"Jul 16, 2013"];
          

          注意:此函数基于从此处获取的代码: https://stackoverflow.com/a/3968411/391605

          我的解决方案一直使用以下代码,但我发现有时,它只是不会解析,并且会返回 nil.

          //  Take a date string in the format "Oct 23, 2013", and convert it into a NSDate value
          //  THIS DOESN'T WORK !  DON'T TRUST THIS CODE !!
          NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
          [formatter setDateFormat:@"MMM dd, yyyy"];
          [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
          
          NSDate* date = [formatter dateFromString:dateString];
          

          我记得它在“2012 年 10 月 12 日”惨遭失败......这就是为什么我放弃并使用上面显示的更复杂的“parseDateString”函数。

          我的意思是……小心。

          一些非常基本的 NSDate 函数无法正常工作...

          【讨论】:

            猜你喜欢
            • 2011-01-28
            • 2011-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多