Carbon中文DayOfWeek

最近工作需要重構一個行事曆的功能,原本的日期運算是採用PHP DateTime處理,我順手將它改成效習慣的 Carbon 套件,但在要輸出星期幾的時候卻卡關了,在不想要做Array mapping為前提的狀況下嘗試了許久。

最近工作需要重構一個行事曆的功能,原本的日期運算是採用PHP DateTime處理,我順手將它改成效習慣的 Carbon 套件,但在要輸出星期幾的時候卻卡關了,在不想要做Array mapping為前提的狀況下嘗試了許久

英文的狀況很單純

Carbon::now()->englishDayOfWeek

但中文的狀況就複雜了點,再加上現在升級到了Carbon2,官方沒有獨立的doc,有些method被棄用,所以網路上的一些method已經過時了

先講結論,不確定是不是我個人本機上的問題,輸出後為亂碼字串,必須要經過GBK轉UTF8才會是正常的中文(還好這些字簡繁都相同)

mb_convert_encoding(\Carbon\Carbon::now()->localeDayOfWeek, 'UTF-8', 'GBK')

在document上看到的說明是這樣的

// Following are deprecated, locale* and shortLocale* properties
// are translated using formatLocalized() based on LC_TIME language.
setlocale(LC_TIME, 'German');
var_dump($dt->localeDayOfWeek);                              // string(6) "Friday"
var_dump($dt->shortLocaleDayOfWeek);                         // string(3) "Fri"
var_dump($dt->localeMonth);                                  // string(7) "October"
var_dump($dt->shortLocaleMonth);                             // string(3) "Oct"
setlocale(LC_TIME, '');

首先先嘗試輸出localeDayOfWeek看看結果,出來居然是亂碼

\Carbon\Carbon::now()->localeDayOfWeek;             //string(6) "����һ"

再多次嘗試setlocale( 第二參數可支援ISO 639-1、ISO 639-2(部分)、English name of Language,詳細名稱參閱 ISO639 )
建議在使用前先檢查自身機器Locale設定是不是中文,我把上面嘗試完才想到這個問題XDDDD
如果已經是中文了變可以略過這一步

//If locale is "0", the locale setting is not affected, only the current setting is returned.
setlocale(LC_TIME, 0);          //string(18) "Chinese_Taiwan.936" 

最後參閱 這篇 底下的回文,發現formatLocalized出來居然要iconv才會試正常的文字
先檢查一次輸出內容的編碼,沒想到居然依舊是UTF-8,只好死馬當活馬醫,照樣轉碼試試看,沒想到就成功了

mb_detect_encoding(\Carbon\Carbon::now()->localeDayOfWeek);                   //string(5) "UTF-8"
mb_convert_encoding(\Carbon\Carbon::now()->localeDayOfWeek, 'UTF-8', 'GBK')   //string(9) "星期五"