【问题标题】:Trying to capitalize abbreviated day of the week in NSDateFormatter object in iOS尝试在 iOS 的 NSDateFormatter 对象中大写星期几的缩写
【发布时间】:2013-12-10 21:26:21
【问题描述】:

我正在开发一个 iOS 应用程序,其中我有一个 NSDateFormatter 对象,如下所示:

NSDate *today = [NSDate date];
 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
 [dateFormat setDateFormat:@"EEE, MMM. dd"];
 NSString *dateString = [dateFormat stringFromDate:today];
 NSLog(@"%@", dateString);

我的输出是:Tue,12 月 10 日,我想显示:TUE,12 月 10 日。

但我的问题是一周中只有第一个字母大写,而不是一整天(即我得到“Tue”,我想显示“TUE”)。月份的格式很好(即“Dec”我很满意)。

我已经检查了日期格式的规范,不幸的是没有使用 NSDateFormatter 类的常规方法。有没有办法在不触及月份的情况下仍将星期几中的所有缩写字母大写?

【问题讨论】:

  • 也许你应该在你的 NSDateFormatter 上做 setShortWeekdaySymbols ? [dateFormat setShortWeekdaySymbols:@[@"SUN",@"MON",...]];

标签: ios nsdate nsdateformatter


【解决方案1】:

无法直接使用日期格式化程序执行此操作。最简单的方法是在格式化日期后处理字符串。

NSString *dateString = [dateFormat stringFromDate:today];
dateString = [NSString stringWithFormat:@"%@%@", [[dateString substringToIndex:3] uppercaseString], [dateString substringFromIndex:3]];

更新:

以上假设 EEE 总是给出一个 3 个字母的工作日缩写。可能存在某些区域设置或语言,其中该假设无效。更好的解决方案如下:

NSString *dateString = [dateFormat stringFromDate:today];
NSRange commaRange = [dateString rangeOfString:@","];
dateString = [NSString stringWithFormat:@"%@%@", [[dateString substringToIndex:commaRange.location] uppercaseString], [dateString substringFromIndex:commaRange.location]];

【讨论】:

  • @SamBudda 不会的。格式为EEE,它总是给出三个字母的工作日。所以Thursday 变成了Thu
  • @rmaddy 这与链接到 Apples Date Formatter 文档的本文档相反:unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns - 它为 EEE 提供了 4 个字母示例,例如:工作日:E - 1..3 - 星期二跨度>
  • @Jasarien 我明白你在说什么,但在现实生活中,当我使用EEE 时,我总是得到一个三个字母的工作日缩写。我从未见过 EEE 给出 4 个字母的结果。
  • 它是否返回本地化名称?本地化名称是否可能超过 3 个?
  • @Jasarien 现在这是一个好问题。我想那里有一个语言环境,EEE 给出的不是 3 个字母的工作日名称。我会更新我的答案来处理这个问题。
【解决方案2】:

接受的答案并没有真正解决所提出的问题。就像Hot Licks 评论的那样,可以在 DateFormatter 实例上设置(标准/短/长/等)工作日/月份符号:

dateFormatter.shortWeekdaySymbols = dateFormatter.shortWeekdaySymbols.map { $0.localizedUppercase }
dateFormatter.monthSymbols = dateFormatter.monthSymbols.map { $0.localizedCapitalized }

如果您需要将格式化程序的语言环境设置为默认值以外的设置,您应该在这样做之后进行这些调用。

【讨论】:

  • 这个答案值得奖牌
【解决方案3】:

只需单独获取日期,将其大写,然后获取日期的其余部分并附加它。像这样:

[dateFormat setFormat:@"EEE"];
NSString *day = [dateFormat stringFromDate:today];
[dateFormat setFormat:@"MMM. dd"];
NSString *restOfDate = [dateFormat:stringFromDate:today];
NSString *fullDate = [[day uppercaseString] stringByAppendingFormat:@", %@", restOfDate];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多