PHPで日付のフォーマットを変えたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 437

2019年5月13日という変数の中身を、2019-05-13と表示したいです。

以下が書いたコードです。

var_dump($date) //  string(10) "2019年5月13日"
$date_hyphen = date( 'Y-m-d', strtotime( $date ) );
var_dump($date_hyphen); // string(10) "1970-01-01"


strtotimeを使ったのですがうまく表示できませんでした。
問題点など教えていただけると助かります。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2019/05/13 20:40

    月月日に引っかかってサンプルコードが通らない通らない(汗

    キャンセル

  • minaraiengineer

    2019/05/13 21:29

    すみません。修正いたしました。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/05/14 07:22

    > 月月日に引っかかってサンプルコードが通らない通らない(汗

    通らないサンプルを書いたのはあなたでちゅ。

    キャンセル

回答 3

+2

提示されたコード内では$date_dateが定義されていないです。(誤情報だったようです)

追記
マニュアル見ると良いです。
strtotime

この関数は英語の書式での日付を含む文字列が指定されることを期待しており、 now で与えられたその形式から Unix タイムスタンプ (1970 年 1 月 1 日 00:00:00 UTC からの経過秒数) への変換を試みます。 now が指定されていない場合は現在日時に変換します。

さらに追記
フォーマットに沿ったパーサが用意されています。
DateTime::createFromFormat / date_create_from_format

日付系はめんどいので、ライブラリを使用するのも一般的かと。

フーマット変換に関しての考え方
誤情報だらけの質問だったせいで、お遊びの回答コードしかつかなかったため補足しておきます。

本件は、フォーマット変換の質問です。
元の文字列を「日付」として扱うのであれば、パースと再構築には日付系の関数やライブラリを使用するのが適切です。
元の文字列を「文字列」として扱うのであれば、正規表現と書式用の関数で処理すると良いです。

サンプルコードを貼っときます。

<?php
$date_org = '2019年5月13日';
// $date_org = '2019年2月29日';

/*
 * 日付として処理
 */
$date_hyphen1 = DateTime::createFromFormat('Y年m月d日', $date_org)->format('Y-m-d');
/*
 * 文字列として処理
 */
preg_match('/^(\d{4})年+(\d{1,2})月+(\d{1,2})日$/u', $date_org, $matches);
$date_hyphen2 = sprintf('%1$04d-%2$02d-%3$02d', $matches[1], $matches[2], $matches[3]);

echo $date_hyphen1;
echo PHP_EOL;
echo $date_hyphen2;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/16 21:28

    てつじしゃんは頭おかしいんでちゅか?

    >preg_replace なら、['/年|月/u','/日/u'],['-','']で良いと思う。

    これ、なんだったんでちゅか?

    キャンセル

  • 2019/05/17 05:56

    サンプルコード、自分で書きたくなかったから、looper さんに書いてもらおうとしただけでしょ^^;
    「これがせいかいでしゅ」とか言ってアップデートしてくれると思ったのに、全然オレのパス受け取らんから、めんどくなって書いちゃったわw

    キャンセル

  • 2019/05/18 09:29

    おうんごーるしそうな勢いであさっての方向に突然ボールを蹴られても、
    ぽっくんは知らないでちゅよ。

    キャンセル

checkベストアンサー

0

<?php

$date = '2019年5月13日';
$matches = [];
mb_regex_encoding("UTF-8");
if (preg_match('/^(\d+)\D+(\d+)\D+(\d+)\D+$/u', $date, $matches)) {
    $year = $matches[1];  $month = $matches[2];  $day = $matches[3];
    $dt = new DateTime($year . '/' . $month . '/' . $day);
    echo $dt->format('Y-m-d');
} else {
    echo 'no match.';
}


数字と数字じゃないところと、っていう区切り方で強引に決着を付けてる。
質問文で年月日に直されたので、一応動作確認とった。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/13 21:10

    訂正したコードが動くのだから、何も問題ない。

    キャンセル

  • 2019/05/14 07:23

    m6uしゃんはきっと、仕事でもポカばっかりやっていちょうでちゅねぇ。

    キャンセル

  • 2019/05/15 11:17

    回答ありがとうございます

    キャンセル

-3

2019月のところがめんどくしゃかったでちゅ。

<?php
$date = "2019月5月13日";
var_dump($date);                                //  string(16) "2019月5月13日"

$date = preg_replace("/(\d{4})[年月](\d{1,2})月(\d{1,2})日/u", "$1-$2-$3", $date);
var_dump($date);                                //  string(9) "2019-5-13"

$date_hyphen = date( 'Y-m-d', strtotime($date) );
var_dump($date_hyphen);                         // string(10) "2019-05-13"

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/14 19:54

    おかえしちておくでちゅ。

    キャンセル

  • 2019/05/14 20:52

    preg_replace の目的が日本語表記を strtotime で読み込めるフォーマットに変換することだから、「年月」→「-」,「日」→消すが素直な変換な気がするって提案だけど、まぁ、どうでも良いコメントですw

    キャンセル

  • 2019/05/15 20:36

    てつじしゃんは、じぇんじぇん仕事というものをわかっていないでちゅねぇ。
    そんな事ではダメでちゅ。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる