【问题标题】:NSDate in full style but without yearNSDate 完整风格但没有年份
【发布时间】:2011-01-05 01:39:07
【问题描述】:

我正在使用适用于 iPhone 的 Objective C 并且有一个我想以完整样式显示但没有年份的 NSDate。现在我正在使用下面的代码,但它也显示年份,我不希望这样。由于我想以正确的区域格式显示日期,因此我不能只删除最后的年份,因为在某些国家/地区,年份不会在最后,而是在中间或开始。

NSDate *testdate = [NSDate date];
NSDateFormatter *dateFormattertest = [[NSDateFormatter alloc] init];
[dateFormattertest setDateStyle:NSDateFormatterFullStyle];
[dateFormattertest setTimeStyle:NSDateFormatterNoStyle];
NSString *formattedDateString = [dateFormattertest stringFromDate:testdate];
NSLog(formattedDateString);

In US this give me:
Thursday, January 14, 2010

In Sweden this give me:
torsdag, 2010 januari 14

解决办法是什么?还有一个问题,我在哪里可以找到有关如何使用 NSDateFormatter 的 setDateFormat 的信息?我找不到有关 API 中不同字母代表什么的信息。

【问题讨论】:

    标签: iphone nsdate nsdateformatter


    【解决方案1】:

    斯威夫特 5

    来自@Joss 的回复:

    extension Date {
        
        func output(_ components: String = "EEEEMMMMd") -> String{
            
            let currentLocale: Locale = Locale.current
    
            // Set the date components you want
            let dateComponents: String = components
    
            // The components will be reordered according to the locale
            let dateFormat = DateFormatter.dateFormat(fromTemplate: dateComponents, options: 0, locale: currentLocale)
    
            let formatter =  DateFormatter()
            
            formatter.dateFormat = dateFormat
    
            return formatter.string(from: self)
        }
    }
    

    【讨论】:

      【解决方案2】:

      斯威夫特 4

      extension Date {
          public func formattedFromComponents(styleAttitude: DateFormatter.Style, year: Bool = false, month: Bool = false, day: Bool = false, hour: Bool = false, minute: Bool = false, second: Bool = false, locale: Locale = Locale.current) -> String {
              let long = styleAttitude == .long || styleAttitude == .full
              let short = styleAttitude == .short
              var comps = ""
      
              if year { comps += long ? "yyyy" : "yy" }
              if month { comps += long ? "MMMM" : (short ? "MM" : "MMM") }
              if day { comps += long ? "dd" : "d" }
      
              if hour { comps += long ? "HH" : "H" }
              if minute { comps += long ? "mm" : "m" }
              if second { comps += long ? "ss" : "s" }
              let format = DateFormatter.dateFormat(fromTemplate: comps, options: 0, locale: locale)
              let formatter = DateFormatter()
              formatter.dateFormat = format
              return formatter.string(from: self)
          }
      }
      

      【讨论】:

        【解决方案3】:

        @Joss 对 Swift 扩展做出了很好的回答:

        extension NSDate {
            func formattedFromCompenents(styleAttitude: NSDateFormatterStyle, year: Bool = true, month: Bool = true, day: Bool = true, hour: Bool = true, minute: Bool = true, second: Bool = true) -> String {
                let long = styleAttitude == .LongStyle || styleAttitude == .FullStyle
                var comps = ""
        
                if year { comps += long ? "yyyy" : "yy" }
                if month { comps += long ? "MMMM" : "MMM" }
                if day { comps += long ? "dd" : "d" }
        
                if hour { comps += long ? "HH" : "H" }
                if minute { comps += long ? "mm" : "m" }
                if second { comps += long ? "ss" : "s" }
        
                let format = NSDateFormatter.dateFormatFromTemplate(comps, options: 0, locale: NSLocale.currentLocale())
                let formatter = NSDateFormatter()
                formatter.dateFormat = format
                return formatter.string(from: self)
            }
        }
        

        【讨论】:

          【解决方案4】:

          斯威夫特 3

              let template = "EEEEdMMM"
          
              let format = DateFormatter.dateFormat(fromTemplate: template, options: 0, locale: NSLocale.current)
              let formatter = DateFormatter()
              formatter.dateFormat = format
          
              let now = Date()
              let whatYouWant = formatter.string(from: now) // ex: Sunday, Mar 5
          

          使用template 来满足您的需求。

          文档和示例here 可帮助您确定所需的模式。

          【讨论】:

          • 这是完美的。谢谢。
          【解决方案5】:

          这是一个在标签上仅显示月份日期的快捷选项:

          let todaysDate: NSDate = NSDate()
          let formatter = NSDateFormatter()
          formatter.dateFormat = "MMMM dd"
          self.todayLabel.text = formatter.stringFromDate(todaysDate)
          

          【讨论】:

          • 该问题明确指出“我想以正确的区域格式显示日期”。
          【解决方案6】:

          我知道这是一个相当老的问题,但这是我在 SO 上找到的唯一一个与我遇到的相同问题的问题。

          这里使用的关键方法是:dateFormatFromTemplate

          您想设置格式,而不是设置样式:

          NSDate *testdate = [NSDate date];
          
          NSLocale *currentLocale = [NSLocale currentLocale];
          
          // Set the date components you want
          NSString *dateComponents = @"EEEEMMMMd";
          
          // The components will be reordered according to the locale
          NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:currentLocale];
          NSLog(@"Date format for %@: %@", [currentLocale displayNameForKey:NSLocaleIdentifier value:[currentLocale localeIdentifier]], dateFormat);
          
          NSDateFormatter *dateFormatter =[[NSDateFormatter alloc] init];
          [dateFormatter setDateFormat:dateFormat];
          
          NSString *formattedDateString = [dateFormatter stringFromDate:testdate];
          NSLog(formattedDateString);
          

          特别感谢:http://oleb.net/blog/2011/11/working-with-date-and-time-in-cocoa-part-2/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-09
            • 1970-01-01
            • 2016-05-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-25
            相关资源
            最近更新 更多