格式化具有不确定数据的日期

时间:2016-01-31 17:39:35

标签: php date datetime formatting date-formatting

快速搜索没有返回任何符合我要求的结果,所以我来这里寻求你的帮助。

我正在制作格式化生日。问题是,使用只能输入一些(或没有)数据。它分别存储为日,月和年。

基本上,根据现有数据,将确定如何格式化日期并将其显示给用户。

我的方法是:

#prepare birthday
        $bday = new DateTime();
        $bday->setTimezone(new DateTimeZone('America/New_York'));
        $bday->setDate($row->birth_year,$row->birth_month,$row->birth_day);

        if($row->birth_month && $row->birth_year && $row->birth_day){
            //Full birthday entered
            $display_bday = $bday->format('F j, Y');    
        } elseif($row->birth_month && !$row->birth_year && !$row->birth_day){
            //Only a month
            $display_bday = $bday->format('F');     
        } elseif($row->birth_month && $row->birth_year && !$row->birth_day){
            //Only Month and year
            $display_bday = $bday->format('F, Y');  
        }

我想知道是否有更好的方法来完成这项任务。我想我认为必须有更好的方法。提前致谢。如果我需要澄清任何事情,请问问!

编辑:删除不必要的代码

1 个答案:

答案 0 :(得分:0)

您的代码可能会输出无效日期,因为您在设置DateTime对象时没有过滤输入。当$row->birth_day等于0时,DateTime对象将移回上个月(上一个日期)。

所以,我建议考虑一下:

$display_bday = null;
if ($row->birth_month) {
  if ($row->birth_year) {
    if ($row->birth_day) {
      // day, month, and year
      $display_bday = date('F j, Y', strtotime("$row->birth_year-$row->birth_month-$row->birth_day"));
    } else {
      // month and year
      $display_bday = date('F, Y', strtotime("$row->birth_year-$row->birth_month-01"));
    }
  } else {
    if ($row->birth_day) {
      // day and month
      $display_bday = date('F j', strtotime("2016-$row->birth_month-$row->birth_day"));
    } else {
      // month only
      $display_bday = date('F', strtotime("2016-$row->birth_month-01"));
    }
  }
}