为什么 [dateFormatter stringFormat:[NSDate date]] 不能转换为数字

Why [dateFormatter stringFormat:[NSDate date]] can not be converted to a number

//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] 代码可能是 return 值是 nil。这可能发生吗?如果是这样,如何重现它? NSDate date return nil question

设备信息:

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

如果我 运行 你的代码覆盖了我可用的所有 740 个区域设置标识符,它在其中的 60 个上失败。下面显示了此代码失败的区域设置标识符的 子集 ,以及它们的(美国)英文名称和它们生成的字符串,格式为 "HH" for 2 PM:

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 构造函数 returns nil 然后被强制展开 (!)。


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

Calendar.current.component(.hour, from: date)