bugfix> php > 投稿

以下の関数を使用して、Wordpressの高度なカスタムフィールドにテキストとして保存されている誕生日の日付(ヨーロッパ形式DD/MM/YYYY)からの人々の年齢(年)を計算しています

function get_age($birthDate_old) {
    $birthDate = ($birthDate_old);
    return date_diff(new DateTime($birthDate), new DateTime('today'))->y;
}

ほとんどの場合は正常に動作しますが、場合によっては以下のエラーが発生します。

Fatal error: Uncaught Exception: DateTime::__construct(): Failed to parse time string (26/01/1958) at position 0 (2): Unexpected character in /home/XXXX/functions.php:99 Stack trace: #0 /home/XXXX/functions.php(99): DateTime->__construct('26/01/1958') #1 /home/XXXX/single.php(69): get_age('26/01/1958') #2 /home/XXX/wp-includes/template-loader.php(98): include('/home/XXX/...') #3 /home/XXX/wp-blog-header.php(19): require_once('/home/XXX/...') #4 /home/XXX/index.php(17): require('/home/monmaire/...') #5 {main} thrown in /home/XXXX/functions.php on line 99

正常に機能するデータの例: $age = get_age($Birthday);

$birthday値= 05/04/1946の場合は正常に機能しますが、$birthday値= 26/01/1958の場合は上記のエラーが発生します。 2つのケースでデータが同じ形式に見えるので、なぜかわかりません。

理由はありますか?

ありがとう。 よろしく。

回答 3 件
  • 私はあなたの関数をこのように修正します:

    function get_age($birthDate_old) {
        return date_diff(
            DateTime::createFromFormat('d/m/Y', $birthDate_old), 
            new DateTime('today')
        )->y;
    }
    
    

    あなたの場合、DateTimeコンストラクターはあなたが月を渡すか日を渡すかを知らないため、日付が正しくフォーマットされていません。

    051946年4月は大丈夫です。

    2626はデフォルトで月を表すため、1958年1月1日は問題ありません。

  • これによれば:

    https://www.php.net/manual/en/datetime.formats.php

    // THIS IS INVALID, WOULD IMPLY MONTH == 19
    $external = "19/10/2016 14:48:21";
    // HOWEVER WE CAN INJECT THE FORMATTING WHEN WE DECODE THE DATE
    $format = "d/m/Y H:i:s";
    $dateobj = DateTime::createFromFormat($format, $external);
    $iso_datetime = $dateobj->format(Datetime::ATOM);
    echo "SUCCESS: $external EQUALS ISO-8601 $iso_datetime";
    
    

    26は月として扱われます。だから、追加 $format = "d/m/Y"; 上記のようにあなたの日付に。

  • 問題は日付形式です。 「/」と「-」を切り替えていると思います。大きなデータを処理している場合、データベース全体を修正する必要があるのは難しいので、ユーザー/ DBから取得しているものが正しい形式であることを常に確認するために、preg_replaceを実行することをお勧めします。以下のサンプルコードを見つけてください。

    function get_age($birthDate_old) {
        $birthDate = ($birthDate_old);
        return date_diff(new DateTime($birthDate), new DateTime('today'))->y;
    }
    
    $birthDate = "26/01/1958";
    $birthDate = preg_replace("(/)", "-", $birthDate);
    echo get_age($birthDate);
    
    

    お役に立てば幸いです。お知らせ下さい

あなたの答え