-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或高声望的人就可以了,而不是我们。这将被放入队伍中,以便进行迁移,不出汗。 –