iOS時間格式化遇到的坑

Eric君發表於2018-01-03

**前言:**最近做專案上傳檔案到騰訊雲,在自己手上的真機上測試沒有出現任何問題,提交測試後,也沒出現任何問題,都可以上傳到騰訊雲。 可是從app store下載後,部分客戶投訴上傳不成功,提示以下錯誤資訊:

-180 ERROR_CMD_COS_INVALID_PATH 非法路徑

當時就蒙了,那麼多測試機怎麼都沒問題,這麼錯誤怎麼找?只能去查查騰訊雲提供的錯誤解決方案,然而只說了這麼一條:

解決方案

好吧,還是自己去查程式碼:

//sign, bucket都是騰訊雲提供的
//zipPath 為 (~/document/XXX.db.zip)
//remotePath是通過時間戳來生成的
TXYFileUploadTask *fileTask = [[TXYFileUploadTask alloc] initWithPath:zipPath
                                                                    sign:sign
                                                                  bucket:bucket
                                                         customAttribute:nil
                                                         uploadDirectory:remotePath
                                                              msgContext:nil];

複製程式碼

獲取remotePath的時間戳的程式碼如下:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYYMMddhhmmssSSS"];
NSString *date = [formatter stringFromDate:[NSDate date]];

複製程式碼

仔細看看,唯一可能產生變化的是沙盒那個路徑,先把問題定位在沙盒路徑,與騰訊雲定義的規範有衝突?公司測試機都又測不出問題,於是就聯絡朋友,紛紛下載使用,最終還是找到一個可以出現“非法路徑”的真機,說多了都是淚。

省去測試流程,發現問題所在,就是格式化日期的坑,上面的時間戳的程式碼,執行一下:

錯誤顯示

控制檯居然顯示: 格式化後字串:2016060310:38:46.702

what happened!!! 居然沒按時間格式的字串格式化!!!出現了":",好了,這個就是問題所在,解決它的方案,設定formatter的區域:

解決方案

結果就按自己定義的格式顯示了,再放入專案中,發現上傳成功,OK!原來是區域的問題,好吧,我來看看到底原來到底是什麼鬼區域,程式碼如下:

顯示原來區域

Wow,居然是“zh_CN”,那為什麼不按我們設定的格式格式化日期呢?非要強制設定區域之後才能正常格式化,百思不解!

####設定區域在格式化時間中的重要性####

formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
複製程式碼

**補充:**對於這樣的小問題,強烈推薦還是用JSPatch來修復。 JSPatch分發平臺:http://jspatch.com/Apps/index JSPatch轉化平臺:http://bang590.github.io/JSPatchConvertor/

相關文章