LoginSignup
saltPopcorn
@saltPopcorn

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

日付フォーマットの種類について

Q&AClosed

日付のフォーマットを揃える質問

そもそも対応する形式がいくつもあるのが対応面倒

日付処理で一つ困っていることがございます。

2020-01-01
2020/01/01

このような形式のフォーマットはCarbonでの処理

Carbon::createFromFormat('Y-m-d', $value);

が通るのですが

今回上記の形式以外に

2020.01.01
2020.1.1
20200101

のような形があり
それをCarbonでY-m-d型にできなかったので、
正規表現から文字列操作で変換した所

「Carbonでできない?」

とふわっとした返答が返ってきたため

(できてたら最初からしてるわ。。。エラーでたからやってるんだよ)

と思いながら、探しています。

まず可能なのでしょうか

可能であれば

可能であれば、どのような記述になるのでしょうか

よろしくお願い致します。

0

2Answer

あまりCarbonには詳しくないので当て勘ですが、こういう形だとエラーが出てしまうということでしょうか?

$input = "2020.07.22";
$datetime = DateTime::createFromFormat('Y.m.d', $input);
$formattedDatetime = $datetime->format('Y/m/d');

となると、(入力のフォーマットが事前にわからないのであれば特に)手動でフォーマットを修正してあげるしかなさそうな気がします。
お力になれずすみません。

1Like

Comments

  1. @saltPopcorn

    Questioner
    @studio15 さん
    記述が足りてなかったのに回答頂きありがとうございます

    今回が
    2020/01/01
    2020/1/1
    2020.01.01
    2020.1.1
    20200101
    の5パターンのどれでも対応する処理になっていて、

    そこで形式が違うもののため
    一つ一つ正規表現でチェックしたのち
    Carbonでフォーマット出来るものもあれば、できないものもあり

    ただ今回のcreateFromFormatで補えるものと補えないものが
    少し分かってきました
    ありがとうございます

    例えば

    ```

    $input = "2020.7.99";
    $datetime = DateTime::createFromFormat('Y.m.d', $input);
    $formattedDatetime = $datetime->format('Y/m/d');

    ```

    とすると2020/07/99ではなく
    2020/10/07
    とトンデモナイ日付に変わることもわかりました。

    まだ知らない事があるかもしれませんが、
    大変助かりました
    ありがとうございます

    ps:ここでのコードの埋め込みの装飾はどれになるのでしょうか(TT

すみません、例示コードがCarbonじゃなくてDateTimeになっちゃっていましたね。(挙動は変わらないと思いますが)

入力としてやってくる日付文字列が定形でないとすると、やはり今書かれているように正規表現なりで日付のフォーマットを確認してから変換してあげる必要があるように思います。
ただ2020.7.99という日付が正しく変換できないという点については、そもそも2020.7.99という日付は存在しないので、存在している7月1日から98日後の10月7日に変換してくれているのは正しい挙動だと思います。(7月1日に98日を加算したとき7月99日が出力されたら困るので)

コードブロックは、ここの入力欄の右上の「?」のリンク先のこのページに書き方がありますよー。
https://qiita.com/Qiita/items/c686397e4a0f4f11683d#%E3%81%9D%E3%81%AE%E4%BB%96

0Like

Comments

  1. @saltPopcorn

    Questioner
    @studio15 さん
    いえいえCarbonもDateTimeの拡張(という認識)
    なので大変助かりました

    07.99等の超えた日数も月が跨ぐのが正常な動きなので、
    それは仕様上正しいと思います自分も

    ですので、手入力でどんな日にちが来るかわからない分、
    Carbon等で処理すると予想外の日にちに変換されて登録等なるので
    仕方なく文字列操作してました

    大変助かりました!ありがとうございます。

    お返事遅くなりすみません


    ps
    ```
    test
    ```
    で囲っても何故かコードにならなかった・・・TT

Your answer might help someone💌