【发布时间】:2011-11-11 22:12:30
【问题描述】:
我有一个介于 1 和 7 之间的数字,我想将其转换为用户的区域设置,相当于星期一到星期日。我可以这样做吗?如果可以,怎么做?
【问题讨论】:
-
(a) 做个好人。 (b) 那是从日期得到的,而不是日期。
标签: objective-c ios cocoa-touch localization
我有一个介于 1 和 7 之间的数字,我想将其转换为用户的区域设置,相当于星期一到星期日。我可以这样做吗?如果可以,怎么做?
【问题讨论】:
标签: objective-c ios cocoa-touch localization
NSDateFormatter 可以为您提供姓名列表:
NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setLocale: [NSLocale currentLocale]];
NSArray * weekdays = [df weekdaySymbols];
然后您可以像任何其他数组一样对其进行索引[weekdays objectAtIndex:dayIdx]; 但是请注意,the first weekday 可能因区域设置而异;具体如何变化(以及关于NSCalendar 的许多其他事情)在文档中并没有得到特别好的解释。
【讨论】:
weekdaySymbols 方法已从 NSDateFormatter 中弃用,并创建了 @987654329 的类方法@类。
NSCalendar 的真正工作,当然也不是类的。现在,您必须在NSLocale 中寻找符号才能获取设备以外的语言环境的符号?不过,感谢您的说明。
这是我的看法:
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"]
【讨论】:
当然可以。下面是一个方法/函数,它返回 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]
}
【讨论】:
NSArray *weekdaySymbols = [[NSDateFormatter alloc] weekdaySymbols];
您可以使用 {weekdaySymbols、shortWeekdaySymbols、veryShortWeekdaySymbols} 之一
【讨论】:
[[[NSDateFormatter alloc] init] weekdaySymbols] :)
基于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
}
【讨论】:
我找到了这个解决方案: 你有你的日期对象,你想从那个对象中得到星期几。
将语言环境设置为您的日期格式化程序,如下所示
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")
}
这样做您可以确保您获得了日期格式化程序的正确标识符,之后配置了日期格式化程序,您可以继续获取星期几的字符串
//convert your date to string
let stringDate = dateFormatter.string(from: eventDate!)
return stringDate
我希望这对某人有所帮助:)。新年快乐。
【讨论】:
如果您正在处理 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)
}
}
这将自动检测您应用的语言并将本地化日期输出为字符串。
【讨论】: