【问题标题】:Format NSDate to this format in NSString:- January 15 2013在 NSString 中将 NSDate 格式化为这种格式:- 2013 年 1 月 15 日
【发布时间】:2015-05-20 08:59:24
【问题描述】:

目前,我将日期存储在 NSArray 中,因为我必须在自定义下拉视图中加载日期列表,但由于以下问题而无法这样做。

这是我尝试格式化 NSDate 的代码:-

 NSCalendar *currentCalendar = [NSCalendar currentCalendar];
    NSDate *today = [NSDate date];

    NSInteger dc = [currentCalendar  ordinalityOfUnit:NSDayCalendarUnit
                                               inUnit:NSYearCalendarUnit
                                              forDate:today];

    datesArray = [[NSMutableArray alloc]init];
    for (int index = 1; index <= dc; index++)
    {


    NSDateComponents *components = [[NSDateComponents alloc] init];
            [components setDay:index];
    NSCalendar *gregorian = [[NSCalendar alloc]
                                     initWithCalendarIdentifier:NSGregorianCalendar];
            NSDate *date = [gregorian dateFromComponents:components];// Year is coming "0000" --log is: "0000-12-31 18:06:32 +0000"
            NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
            [formatter setDateFormat:@"MMMM dd yyyy"]; //updated
            NSString *articleDateString = [formatter stringFromDate:date]; // getting- Jan 01 0001
           [datesArray addObject: pickerItemTitle];
     } 

但我没有得到想要的输出,例如“2013 年 1 月 15 日”

在 NSDate 中,我也收到类似“0000-12-31 18:06:32 +0000”的信息,谁能告诉我为什么今年即将到来“0000”

【问题讨论】:

  • 你可以试试 4M 作为 [formatter setDateFormat:@"MMMM dd YYYY"];
  • @Larme 这是日期日志:- 0000-12-31 18:06:32 +0000
  • 如果年份是0000,您希望如何拥有2013
  • 我是不是做错了什么,因为我对 NSDate 不太擅长。任何建议都会有帮助@Larme
  • [components setYears:2013]; 开头?在NSDateFormatter(及其NSString 返回)出现问题之前,请检查如何编写正确的日期。

标签: ios objective-c iphone nsdate nsdateformatter


【解决方案1】:

您的代码的问题是您在第 1 天初始化 NSDateComponents,并且由于您没有提供任何年份,因此将年份作为“1”。 因此,为了让您的代码正常工作,您可以将当前日期的年份设置为 NSDateComponents 的年份。

NSCalendar *currentCalendar = [NSCalendar currentCalendar];
NSDate *today = [NSDate date];

NSInteger dc = [currentCalendar  ordinalityOfUnit:NSCalendarUnitDay
                                           inUnit:NSCalendarUnitYear
                                          forDate:today];

NSMutableArray *datesArray = [[NSMutableArray alloc]init];
for (int index = 1; index <= dc; index++)
{

    //Using dateComponents for setting year
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
    NSInteger year = [dateComponents year];

    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setDay:index];

    [components setYear:year];//Setting year of components

    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *date = [gregorian dateFromComponents:components];// Year is coming "0000" --log is: "0000-12-31 18:06:32 +0000"
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"MMMM dd yyyy"]; //updated
    NSString *articleDateString = [formatter stringFromDate:date]; // getting- Jan 01 0001
    [datesArray addObject: pickerItemTitle];
    NSLog(@"%@", articleDateString);
}

【讨论】:

  • 我刚看到,但你已经回答了,你的解决方案有效。
  • 终于有人明白了,我的问题是什么。谢谢 User31。
【解决方案2】:

您没有设置 NSDateComponents 对象的月份和年份:

[components setMonth:month];
[components setYear:year];

(参见NSDateComponents class reference 的示例)。

另外,你的格式化字符串是错误的。你需要:

  • MMMM 为全名月份。
  • yyyy 一年。

所以:

[formatter setDateFormat:@"MMMM dd yyyy"];

Here is the reference 关注。

【讨论】:

  • 谢谢,但我仍然没有得到年份。刚刚更新了问题。检查。
  • @Vizllx 因为您仍在使用YYYY 而不是yyyy。请参阅我在答案中发布的参考资料。
  • 测试过,不工作!但是当 NSDate 像这样返回时:- "0000-12-31 18:06:32 +0000" ,我怎样才能得到正确的年份,它即将到来 "0000"
  • @Vizllx 请在您的问题中发布您修改后的代码。
  • 我的目标不是设置月份和年份,我只是在一个数组中尝试过去 100 年的存储日期。这样我就可以在下拉视图中显示列表。
【解决方案3】:

您可以在此处查找格式值: http://waracle.net/iphone-nsdateformatter-date-formatting-table/

在你的情况下,你会想尝试这种格式:

[formatter setDateFormat:@"MMMM dd YYYY"];

【讨论】:

    【解决方案4】:

    用此行替换您的日期格式行:

    [formatter setDateFormat:@"MMMM dd YYYY"];
    

    【讨论】:

      【解决方案5】:

      关注下面的这篇文章。它详细解释了它。

      http://b2cloud.com.au/how-to-guides/nsdateformatter-format-strings/

      【讨论】:

        【解决方案6】:
        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat:@"yyyy-MM-dd"];
        
        NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init];
        [timeFormat setDateFormat:@"HH:mm:ss"];
        
        NSDate *now = [[NSDate alloc] init];
        
        NSString *theDate = [dateFormat stringFromDate:now];
        NSString *theTime = [timeFormat stringFromDate:now];
        
        NSLog(@"\n"
              "theDate: |%@| \n"
              "theTime: |%@| \n"
              , theDate, theTime);
        
        [dateFormat release];
        [timeFormat release];
        [now release];
        

        也看看这个Date and Time它会帮助你很多

        【讨论】:

          【解决方案7】:

          User31 已经回答了我的问题并且确实有效。

          同时经过一些研究,我通过以下过程解决了这个问题,并添加了一种替代方法:-

             datesArray = [[NSMutableArray alloc]init];
              
              
              NSDateComponents *comps = [[NSDateComponents alloc] init];
              [comps setDay:1];
              [comps setMonth:1];
              [comps setYear:1900];
              NSDate *minDate = [[NSCalendar currentCalendar] dateFromComponents:comps];
              
              NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
              NSDateComponents *days = [[NSDateComponents alloc] init];
              NSInteger dayCount = 0;
              while ( TRUE ) {
                  
                  [days setDay: ++dayCount];
                  NSDate *date = [gregorianCalendar dateByAddingComponents: days toDate: minDate options: 0];
                  if ( [date compare: [NSDate date]] == NSOrderedDescending )
                  {
                      [self removeLoader];
                      break;
                  }
                  //NSString *articleDateString = [formatter stringFromDate:date];
                  
                  NSDateFormatter *df = [[NSDateFormatter alloc] init];
                  
                  [df setDateFormat:@"dd"];
                  NSString *dd = [df stringFromDate:date];
                  
                  [df setDateFormat:@"MMMM"];
                  NSString *mm = [df stringFromDate:date];
                  
                  [df setDateFormat:@"yyyy"];
                  NSString *yy = [df stringFromDate:date];
                  
                  
                  NSString *pickerItemTitle = [NSString stringWithFormat: @"%@     %@     %@", mm,dd,yy];
                  [datesArray addObject: pickerItemTitle];
                  
              }
          

          【讨论】:

            【解决方案8】:

            请检查代码

            NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
            dateFormatter.dateFormat = @"MMMM dd yyyy";
            NSDate *yourDate = [dateFormatter dateFromString:@"January 15 2013"];
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-04-29
              • 1970-01-01
              • 2013-12-03
              • 2018-10-24
              • 2010-10-30
              • 1970-01-01
              相关资源
              最近更新 更多