【问题标题】:iOS: How to get a proper Month name from a number?iOS:如何从数字中获取正确的月份名称?
【发布时间】:2018-09-01 15:58:48
【问题描述】:

我知道 NSDateformatter 功能套件对人类来说是一个福音,但同时它也让我很困惑。我希望你能帮助我。

在我的代码中,有一个 int 代表一个月。所以:1 代表 1 月,2 月 2 日,等等。

在我的用户界面中,我想将此整数显示为正确的月份名称。此外,它应该遵守设备的语言环境。

感谢您的见解

与此同时,我做了以下事情:

int monthNumber = 11
NSString * dateString = [NSString stringWithFormat: @"%d", monthNumber];

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM"];
NSDate* myDate = [dateFormatter dateFromString:dateString];
[dateFormatter release];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM"];
NSString *stringFromDate = [formatter stringFromDate:myDate];
[formatter release];

这是这样做的方法吗?好像有点啰嗦。

【问题讨论】:

  • 你可以用 LLLL 替换 MMMM

标签: ios numbers nsdateformatter


【解决方案1】:

另一种选择是使用monthSymbols方法:

int monthNumber = 11;   //November
NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease];
NSString *monthName = [[df monthSymbols] objectAtIndex:(monthNumber-1)];

请注意,您需要从 1..12 的 monthNumber 中减去 1,因为 monthSymbols 是从零开始的。

【讨论】:

  • 这实际上只适用于英语语言环境(和类似的语言)。它不适用于使用案例的语言的语言环境,例如斯拉夫语言。必须使用standaloneMonthSymbols
  • 简化:NSString *monthName = [[[NSDateFormatter alloc] init] monthSymbols][monthNumber-1];
  • 请使用standaloneMonthSymbols
  • 如果您想要较短的月份名称(Jan、Feb...),请使用 [df shortMonthSymbols]
【解决方案2】:

Swift 2.0

let monthName = NSDateFormatter().monthSymbols[monthNumber - 1]

Swift 4.0

let monthName = DateFormatter().monthSymbols[monthNumber - 1]

【讨论】:

    【解决方案3】:

    您可以更改 NSDateFormatter 的 dateFormat。所以为了简化你的代码:

    int monthNumber = 11
    NSString * dateString = [NSString stringWithFormat: @"%d", monthNumber];
    
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM"];
    NSDate* myDate = [dateFormatter dateFromString:dateString];
    
    [formatter setDateFormat:@"MMMM"];
    NSString *stringFromDate = [formatter stringFromDate:myDate];
    [dateFormatter release];
    

    您还应该在初始化日期格式化程序后设置区域设置。

    dateFormatter.locale = [NSLocale currentLocale]; // Or any other locale
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      对此的最佳解决方案是standaloneMonthSymbols 方法,

      -(NSString*)MonthNameString:(int)monthNumber
      {
          NSDateFormatter *formate = [NSDateFormatter new];
      
          NSArray *monthNames = [formate standaloneMonthSymbols];
      
          NSString *monthName = [monthNames objectAtIndex:(monthNumber - 1)];
      
          return monthName;
      }
      

      【讨论】:

        【解决方案5】:

        怎么样:

        NSUInteger i = <your month integer>;
        NSDateFormatter *df = [NSDateFormatter new];
        // change locale if the standard is not what you want
        NSArray *monthNames = [df standaloneMonthSymbols];
        NSString *monthName = [monthNames objectAtIndex:(i - 1)];
        [df release];
        

        【讨论】:

          【解决方案6】:

          Anna Karenina 和 Carl 的两个答案都不能很好地工作,因为对于某些文化,他们不会以 nominativ 返回月份名称。我建议使用 Pascal 提出的解决方案,它解决了这个问题(通过将 monthSymbols 替换为 standaloneMonthSymbols

          【讨论】:

            【解决方案7】:

            在 Swift 3.0 中

                let monthNumber = 3
                let fmt = DateFormatter()
                fmt.dateFormat = "MM"
                let month = fmt.monthSymbols[monthNumber - 1]
                print(month)
            
                // result
               "March\n"        
            

            【讨论】:

            • 在某些语言中最好使用standaloneMonthSymbols 正确区分大小写
            【解决方案8】:

            Swift 4.X

            print((DateFormatter().monthSymbols[month-1].capitalized)) //month is int less than 12

            例如:

            print((DateFormatter().monthSymbols[11-1].capitalized))

            输出

            十一月

            【讨论】:

              【解决方案9】:

              NSDate 到 NSString -> As Dateformat Ex: 2015/06/24

                      NSDateFormatter *dateformate=[[NSDateFormatter alloc]init];
                      [dateformate setDateFormat: @"yyyy/MM/dd"];
                      NSString *date = [dateformate stringFromDate:selectedDate]; // Convert date to string
              

              NSDate 到 NSString -> 作为 Dateformat Ex: 2015 年 6 月 24 日下午 1:02

                      [dateformate setDateFormat:@"yyyy MMMM dd, h:mm a"];
                      NSString *displayDate = [dateformate stringFromDate:selectedDate]; // Convert date to string
                      NSLog(@"date :%@",date);
                      NSLog(@"Display time = %@", displayDate);
              

              【讨论】:

                【解决方案10】:

                还有 ARC :

                + (NSString *)monthNameFromDate:(NSDate *)date {
                    if (!date) return @"n/a";
                    NSDateFormatter *df = [[NSDateFormatter alloc] init];
                    [df setDateFormat:@"MM"];
                    return [[df monthSymbols] objectAtIndex:([[df stringFromDate:date] integerValue] - 1)];
                }
                

                【讨论】:

                  【解决方案11】:

                  你应该能够摆脱 dateFormatter 的释放和重新分配,删掉几行,但我看到的就是这些。

                  【讨论】:

                    猜你喜欢
                    • 2011-09-27
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-01-11
                    相关资源
                    最近更新 更多