以下の関数を使用して、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 件
これによれば:
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);
お役に立てば幸いです。お知らせ下さい
関連記事
- php datetime - : __construct():位置8の時間文字列の解析に失敗しました(0):予期しない文字
- モジュールの解析に失敗しました:Storybook 6111、Webpack 5110、React1701で予期しない文字 '@'(1:0)
- 致命的なエラー:キャッチされていないPDO例外:SQLSTATE [42000]構文エラーまたはアクセス違反
- スナップショットの解析に失敗しました:Firebase setValue ANDROID
- OIDC認証中の相関の取得に失敗した例外
- softlayer_user_customer - : getobjectソフトレイヤーが例外で失敗しました
- grok複数行、たとえば、例外スタックトレースを解析します
- キャッチされない例外 'NSInvalidArgumentException'、理由: '-[SubResultComponent setDate:]:認識されないセレクターがインスタンス0x60000046b640に送信されました'
- Sqoop:例外エラーtoolImportTool:インポートに失敗しました:javanetUnknownHostException:ホスト:ホスト:インポート中の不明なエラー
関連した質問
- WooCommerceDokanマルチベンダーは特定の注文ステータスを持つベンダーの注文を非表示にします
- WordPressは添付ファイルの名前をサムネイルが機能するように変更します
- WooCommerce価格フィルター:送信する代わりに変更時にトリガーする
- PHPの連想配列の空のキーを変更します
- WP post_updated $post_after、$post_before同じ製品カテゴリを表示
- この関数を子テーマに「移動」して、いくつかのパラメーターを変更するにはどうすればよいですか?
- XeroWebhook内のXeroAPIにPOSTリクエストを送信する方法
- 「woocommerce_order_get_formatted_billing_address」フィルターフックを介してメタデータを取得します
- ホームページに別のロゴを表示する:ワードプレス
私はあなたの関数をこのように修正します:
あなたの場合、DateTimeコンストラクターはあなたが月を渡すか日を渡すかを知らないため、日付が正しくフォーマットされていません。
051946年4月は大丈夫です。
2626はデフォルトで月を表すため、1958年1月1日は問題ありません。