-1
所以,我有這樣的要求:更好的代碼結構?
給定的日期($dateissued
)是一個字符串,通常DD.MM.YYYY,但它也可能是MM.YYYY甚至只是YYYY。在後一種情況下,我應該把它作爲一個間隔來處理,比如2005年11月的「2005年11月全部」。要做到這一點,我輸出到$startdate
,如果它是一個區間,$enddate
設置(否則返回空)。輸出進入JSON,所以格式化很好。
- 如果給定日期是XX.XX.XXXX,解析爲DD.MM.YYYY
- 如果給定日期是XX.XXXX,解析爲01.MM.YYYY,並設定結束日期,以LL.MM. YYYY,其中LL是本月的最後一天
如果給定日期是XXXX,解析爲01.01.YYYY,並設定結束日期,以31.12.YYYY
$dateissued = get_sub_field('w_pub_dateissued'); // get Date String from field $parsedstartdate = date_create_from_format('d.m.Y', $dateissued); $startdate = ''; $enddate = ''; if ($parsedstartdate == false) { // date_create_from_format() returns false if it fails $parsedstartdate = date_create_from_format('d.m.Y', '01.'.$dateissued); // try again as 01.MM.YYYY if ($parsedstartdate == false) { $parsedstartdate = date_create_from_format('d.m.Y', '01.01.'.$dateissued); // try again as 01.01.YYYY if ($parsedstartdate == false) { // bad date; nothing todo, $startdate is empty by default } else { // Full Year $startdate = $parsedstartdate->format('d.m.Y'); $parsedenddate = clone $parsedstartdate; $parsedenddate->add(new DateInterval('P1Y'))->sub(new DateInterval('P1D')); $enddate = $parsedenddate->format('d.m.Y'); } } else { // Full Month $startdate = $parsedstartdate->format('d.m.Y'); $parsedenddate = clone $parsedstartdate; $parsedenddate->add(new DateInterval('P1M'))->sub(new DateInterval('P1D')); $enddate = $parsedenddate->format('d.m.Y'); } } else { $startdate = $parsedstartdate->format('d.m.Y'); } return compact('startdate', 'enddate');
我使用此代碼異議:
- 重複
- 嵌套if-循環
- 通常難以把握邏輯
所以,親愛的社區 - 我怎麼能做得更好?你會怎麼做?
我投票關閉這一問題作爲題外話,因爲在代碼審查 – ElefantPhace
@ElefantPhace屬於可我們只是將其轉移到代碼審查? – Martin
@馬丁MODS或高聲望的人就可以了,而不是我們。這將被放入隊伍中,以便進行遷移,不出汗。 –