【HTML】【PHP】<input type="date">で取得した日付フォーマットの変更の仕方について

#背景
カレンダーを作成中、予定を入力したときにカレンダー内に表示させようとしたところ、日付のフォーマットが違ってif文が働かなかったので、同じところで悩まないように備忘録兼ねて作成

#やりたかったこと
```php:日付を取得するフォーム
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="" method="post">
        <input type="date" name="day">
        <button type="submit">送信</button>
    </form>
</body>
</html>

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST'){
    echo $_POST['day'];
?>
```
![スクリーンショット 2022-01-15 18.26.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/be4112ee-5617-f15c-a602-750c4ab78a0d.png)
このフォームに入力された日付は、デフォルトで`yyyy-mm-dd`の形式で表示される。
つまり2022年1月1日を選択して送信すると、`2022-01-01`と表示される。（ここでは`$_POST`で取得していますが、`filter_input()`などを使う方が良いです。）
やりたかったのは、この日付表示を別の形式に直して、`if`文などで使いやすくすること。（自分はY-n-j、つまり`2022-01-01`表示を`2022-1-1`表示にしたかった。）

![スクリーンショット 2022-01-15 19.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/2894e7b6-0795-94f9-43d0-32c43b797fb0.png)
![スクリーンショット 2022-01-15 19.44.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/6b81a636-c211-2aa6-97d9-5218f132484c.png)

##date関数
`yyyy-mm-dd`以外のフォーマットで日付が欲しいときは、`date()`を使用してフォーマットを整えてあげる必要がある。

```php:date関数
<?php
  date(変換後のフォーマット, タイムスタンプ（無くてもいい）);
?>
```
第１引数には、変換後のフォーマット文字列
第2引数には、タイムスタンプ（書かない場合は、現在時刻が使用される）
※ タイムスタンプ：正確にはUNIXタイムスタンプと言うらしい。協定世界時(UTC)での1970年1月1日0時0分0秒からの経過時間を秒数で表したもの。つまり、これを書かないと、1970年1月1日0時0分0秒から現在時刻までの秒数が自動的に第2引数になる。

と言うことで、`date`関数を使用して`2022-1-1`と表示させるため下記のように入力すると、エラーが発生する。

```php:date関数
<?php
  $day = $_POST['day'];
  echo date("Y-n-j", $day);
?>
```
![スクリーンショット 2022-01-15 21.32.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/eb59bd1e-3630-3107-716a-436556ef16da.png)

いろいろ書いてあるが、要は`date()`の第2引数の型は`integer`でなければならないですよ、と言うことである。
`input`タグの`type`属性の値`date`で取得した日付は、`string`型になっているため、上記のように直接第2引数とはできずエラー発生となった。
[input type="date"のドキュメント](https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/date)

##strtotime関数
取得した日付を`int`型にするために`strtotime()`を使用する。

```php:strtotime関数
<?php
  strtotime(変換したい日付の文字列, ベースタイムスタンプ（無くてもいい）);
?>
```
第１引数には、変換したい日付/時刻の文字列
第2引数には、返される値を計算するために使用されるベースタイムスタンプ（書かない場合は、現在時刻が使用される。例えば1日前の日付を取得する際なんかは、ここに`'-01'`を入れたりする。）

長々書いてきたが、要はフォーマットを変えたければ

```php
<?php
  $day = $_POST['day'];
  echo date("Y-n-j", strtotime($day));
?>
```
としてあげれば良い。
以下、`2022-01-01`を変換した一例

```php:
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="" method="post">
        <input type="date" name="day">
        <button type="submit">送信</button>
    </form>
</body>
</html>

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST'){
    $day = $_POST['day'];
    echo date("F j, Y", strtotime($day)) . "<br/>";
    echo date("F j, Y", strtotime($day)) . "<br/>";
    echo date("m.d.y", strtotime($day)) . "<br/>";
    echo date("j, n, Y", strtotime($day)) . "<br/>";
    echo date("Ymd", strtotime($day)) . "<br/>";
    echo date("j-m-y", strtotime($day)) . "<br/>";
    echo date("D M j", strtotime($day)) . "<br/>";
    echo date("Y-m-d", strtotime($day)) . "<br/>";
    echo date("Y-n-j", strtotime($day)). "<br/>";
    echo date("Y年n月j日", strtotime($day)). "<br/>";
    echo date("Y/n/j", strtotime($day)). "<br/>";
}
```
![スクリーンショット 2022-01-15 22.06.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/624722b8-4bcc-7305-41bc-cc22ed1c7cf9.png)

#参考URL
1.[date関数ドキュメント](https://www.php.net/manual/ja/function.date.php)
2.[input type="date"のドキュメント](https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/date)
3.[strtotime関数ドキュメント](https://www.php.net/manual/ja/function.strtotime.php)
4.[タイムスタンプについて](https://techacademy.jp/magazine/36439)