67063
**MySQLのdatetime型カラムより取得した2つの日付文字列を比較する関数を作成したい**  
・年月日が異なる場合は年月日を返す  
・同一年の場合は月日を返す  
・同一年月の場合は日だけを返す  
※年月日は日本語で表示。先頭0なし

**年月日が異なる場合は年月日を返す**  
比較対象.string '2019-05-25 19:23:43'  
取得対象.string '2020-05-25 19:23:43'  
→ '2020年5月25日'を返す

**同一年の場合は月日を返す**  
比較対象.string '2020-05-25 19:23:43'  
取得対象.string '2020-06-25 19:23:43'  
→ '6月25日'を返す

**同一年月の場合は日を返す**  
比較対象.string '2020-05-25 19:23:43'  
取得対象.string '2020-05-26 19:23:43'  
→ '26日'を返す

* * *

**質問**  
どうやって実装したら良いですか？  
下記のように、年月日をそれぞれ取得して条件分岐していく方法しか思い浮かばないのですが、より効率的な方法はありますか？(日付特有の比較できるような処理があるかもしれないと思い質問しました)

```

    $year = mb_strimwidth($str,0,4);
    $month = mb_strimwidth($str,5,2);
    
```
CC BY-SA 4.0
2020-05-28T01:49:14.280
67060
2020-05-29T01:32:24.183
7886
question
php
日付文字列を比較して、年月日が異なる場合は年月日を、同一年の場合は月日を返したい
効率的というのが、  
メモリや計算量が少なくて、条件が少ないという意味であれば、  
質問のように文字列で抽出して、それを比較することが最も効率的でしょう。

`date()`等の日付系の関数は計算をして表現するのでどうしてもCPUやメモリを食うことになるので文字処理で対応できるのであればそれが最も早くてシンプルです。

またmb_strimwidth使ってますが基本的にマルチバイトの文字が飛んでこないことを前提に  
substrで十分かと思います

さらに条件もよりシンプルに考えて  
同一年月の場合  
それ以外で同一年の場合  
それ以外の場合  
にできると思います。

ついでに年と月を抽出の必要もなく、  
同一年の条件→開始位置0から4バイト目まで一緒  
同一年月の条件→開始位置0から7バイト目まで一緒  
それ以外

という形にできると思います。  
上記のことを考えると、以下の感じでしょう。

```

    if (substr($str1, 0, 7) == substr($str2, 0, 7)) {
        return intval(substr($str2, 8, 2)) . "日"; 
    }else if (substr($str1, 0, 4) == substr($str2, 0, 4)) {
        return intval(substr($str2, 6, 2)) . "月" . intval(substr($str2, 8, 2)) . "日";
    }else {
        return intval(substr($str2, 0, 4)) . "月" . intval(substr($str2, 6, 2)) . "月" . intval(substr($str2, 8, 2)) . "日";
    }
    
```

なんだか愚直でみっともなく、可読性も悪いのでDocやコメントでフォローは必要そうです。

また、あまりない要求とは思いますが、年が3桁だったり2桁を許容するようなシステムの場合は渡してくるデータに0パディングが必要になると思います。
CC BY-SA 4.0
2020-05-28T02:48:04.550
67063
2020-05-29T01:32:24.183
2020-05-29T01:32:24.183
22665
22665
67060
answer