【问题标题】:How do I get the name of a day of the week in the user's locale?如何在用户的语言环境中获取星期几的名称?
【发布时间】:2011-11-11 22:12:30
【问题描述】:

我有一个介于 1 和 7 之间的数字,我想将其转换为用户的区域设置,相当于星期一到星期日。我可以这样做吗?如果可以,怎么做?

【问题讨论】:

  • (a) 做个好人。 (b) 那是从日期得到的,而不是日期。

标签: objective-c ios cocoa-touch localization


【解决方案1】:

NSDateFormatter 可以为您提供姓名列表:

NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setLocale: [NSLocale currentLocale]];
NSArray * weekdays = [df weekdaySymbols];

然后您可以像任何其他数组一样对其进行索引[weekdays objectAtIndex:dayIdx]; 但是请注意,the first weekday 可能因区域设置而异;具体如何变化(以及关于NSCalendar 的许多其他事情)在文档中并没有得到特别好的解释。

【讨论】:

  • 仅供参考 - 根据 iOS 7.1 到 iOS 8.0 API 差异,(但不是实际的参考文档),weekdaySymbols 方法已从 NSDateFormatter 中弃用,并创建了 @987654329 的类方法@类。
  • 放置它的地方很奇怪。我想说,这不是NSCalendar 的真正工作,当然也不是类的。现在,您必须在NSLocale 中寻找符号才能获取设备以外的语言环境的符号?不过,感谢您的说明。
【解决方案2】:

这是我的看法:

Swift 3、iOS8+

func weekdayNameFrom(weekdayNumber: Int) -> String {
    let calendar = Calendar.current
    let dayIndex = ((weekdayNumber - 1) + (calendar.firstWeekday - 1)) % 7
    return calendar.weekdaySymbols[dayIndex]
}

请注意,您有 3 个可用列表:

  • weekdaySymbols -> ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
  • shortWeekdaySymbols -> ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
  • veryShortWeekdaySymbols -> ["S", "M", "T", "W", "T", "F", "S"]

【讨论】:

  • 我正在寻找veryShortWeekdaySymbols ...(:谢谢..dude
【解决方案3】:

当然可以。下面是一个方法/函数,它返回 0 到 6 范围内的工作日编号的工作日名称。

Objective C 版本:

- (NSString *)weekdayNameFromWeekdayNumber:(NSInteger)weekdayNumber
{
    NSCalendar *calendar = [NSCalendar currentCalendar];

    // Fetch the days of the week in words for the current language (Sunday to Saturday)
    NSArray *weekdaySymbols = calendar.weekdaySymbols;

    // Because the first week day changes depending on the region settings.
    //  ie. In Bangladesh the first day of the week is Friday. In UK it is Monday
    NSInteger index = (weekdayNumber + calendar.firstWeekday - 1) % 7;
    return weekdaySymbols[index];
}

和 Swift 2 版本:

func weekdayNameFromWeekdayNumber(weekdayNumber: Int) -> String {
    let calendar = NSCalendar.currentCalendar()
    let weekdaySymbols = calendar.weekdaySymbols
    let index = (weekdayNumber + calendar.firstWeekday - 1) % 7
    return weekdaySymbols[index]
}

和 Swift 3.0 版本:

func weekdayNameFrom(weekdayNumber: Int) -> String {
    let calendar = Calendar.current
    let weekdaySymbols = calendar.weekdaySymbols
    let index = (weekdayNumber + calendar.firstWeekday - 1) % 7
    return weekdaySymbols[index]
}

【讨论】:

    【解决方案4】:
    NSArray *weekdaySymbols = [[NSDateFormatter alloc] weekdaySymbols];
    

    您可以使用 {weekdaySymbols、shortWeekdaySymbols、veryShortWeekdaySymbols} 之一

    【讨论】:

    • 不需要[NSLocale currentLocale]。
    • ...但您可能应该在调用 weekdaySymbols 之前初始化您的 NSDateFormatter...[[[NSDateFormatter alloc] init] weekdaySymbols] :)
    【解决方案5】:

    基于gavdotnet优秀解决方案,欧洲版(周一开始)为:

    func weekdayNameFromWeekdayNumber(weekdayNumber: Int) -> String {
        var EuroDay = weekdayNumber + 1
        if EuroDay == 7 {
            EuroDay = 0
        }
        let calendar = NSCalendar.currentCalendar()
        let weekdaySymbols = calendar.weekdaySymbols
        let index = EuroDay + calendar.firstWeekday - 1
        return weekdaySymbols[index].uppercaseString
    }
    

    【讨论】:

    • 我一直在寻找的真棒答案。谢谢
    【解决方案6】:

    我找到了这个解决方案: 你有你的日期对象,你想从那个对象中得到星期几。

    1. 将语言环境设置为您的日期格式化程序,如下所示

      let eventDate = dateFormatter.date(from: self)
      let language = Locale.preferredLanguages.first
      print("The locale id is  \(language)")
      // This date format can be what ever you like, in this case i used EE dd
      dateFormatter.dateFormat = "EE dd"
      if let idiomaLocale = language {
          dateFormatter.locale = Locale(identifier: idiomaLocale)
      } else {
          dateFormatter.locale = Locale(identifier: "es_CO")
      }
      
    2. 这样做您可以确保您获得了日期格式化程序的正确标识符,之后配置了日期格式化程序,您可以继续获取星期几的字符串

      //convert your date to string
      let stringDate = dateFormatter.string(from: eventDate!)
      
      return stringDate
      

    我希望这对某人有所帮助:)。新年快乐。

    【讨论】:

    • 感谢新年祝福!我的问题是如何从一周中的编号中获取名称,而不是从日期中获取名称。
    • 好吧,我可能误解了这个问题
    【解决方案7】:

    如果您正在处理 Date 对象,假设您已经在项目中添加了本地化选项,您可以轻松使用以下代码:

    extension Date {
        var dayName: String {
            let dateFormatter = DateFormatter()
            dateFormatter.locale = Locale(identifier: Locale.current.identifier)
            dateFormatter.dateFormat  = "E" // "EEEE" to get long style
            return dateFormatter.string(from: self)
        }
    }
    

    这将自动检测您应用的语言并将本地化日期输出为字符串。

    【讨论】:

    • 谢谢,但根据问题,我没有日期对象,我有一个介于 1 和 7 之间的数字。
    • 我知道:),但是由于标题没有提到对象类型,所以很多人(包括我)会登陆这个页面,即使他们正在处理一个日期对象。由于您的问题已经回答了数字,我写了一个日期对象的解决方案,以帮助那些因为您的标题和谷歌搜索结果而访问此页面的人。
    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多