为什么[dateFormatter stringFormat:[NSDate date]]无法转换为数字

时间:2017-03-29 11:37:55

标签: ios nsdate nsdateformatter

//In NSDate category:
+ (NSString *)timeWithFormat:(NSString *)format {
   NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
   formatter.dateFormat = format;
   return [formatter stringFromDate:[NSDate date]];
}

//Swift3.0 invoke method:
let nowHour: Int = Int(NSDate.time(withFormat: "HH"))!//Crash code,I can not be reproduced

我认为在致电[formatter stringFromDate:[NSDate date]]时,[NSDate date]代码的返回值可能是nil。这可能发生吗?如果是这样,如何重现它? NSDate date return nil question

设备信息:   enter image description here

1 个答案:

答案 0 :(得分:0)

从查看代码我认为这是一个区域设置问题。并非所有语言环境都使用0-9来表示时间。

如果我在可用于我的所有740语言环境标识符上运行您的代码,则其中有60个会失败。下面列出了此代码失败的区域设置标识符的子集,以及它们的(美国)英文名称及其生成的字符串格式为easy to use and maintain的下午2点:

"HH"

尝试从像ar Arabic ١٤ ars Najdi Arabic ١٤ as Assamese ১৪ bn Bengali ১৪ ckb Central Kurdish ١٤ dz Dzongkha ༡༤ fa Persian ۱۴ hi Hindi १४ ks Kashmiri ۱۴ lrc Northern Luri ۱۴ mr Marathi १४ my Burmese ၁၄ mzn Mazanderani ۱۴ ne Nepali १४ pa_Arab Punjabi (Arabic) ۱۴ ps Pashto ۱۴ ur_IN Urdu (India) ۱۴ uz_Arab Uzbek (Arabic) ۱۴ 这样的字符串创建一个数字会崩溃,因为Int构造函数会返回Int("१४")!,然后强制解包(nil)。

如果您对获取给定时间的小时数值感兴趣,我建议您使用适当的日历获取小时日期组件。例如:

!