PHPでMySQLの日時を別の形式に変換する


447

私が持っているdatetimeMySQLで列を。

PHPを使用してmm / dd / yy H:M(AM / PM)の表示に変換するにはどうすればよいですか?


4
知っておくべきことは、SQL内で日付がどのように保存されるかです。それはタイムスタンプですか、日付時刻ですか、unixtimeですか?
オラフルWaage

通常の日付と同じように、それらはUNIX時間ではなく保存されます。PHPは秒などで処理するものです。PHPのOOP日時関数を使用することをお勧めします。非常に使いやすい関数です。
Gucho Ca 2014

2
あなたの日付形式に代わるものをお勧めできますか?mm/dd/yyは非常にアメリカ人であり、世界の他の地域に住んでいる私たちの人々は、が何を意味するのかを再推測しようとすることに少々苛立ちを感じ11-12-13ます。より一般的な規格はyyyy-mm-ddであり、ISO 8601規格の一部です。それができない場合は、数字ではなく月を使用してください。
Manngo 2017

回答:


515

日付をMySQL形式に正規化する方法を探している場合は、以下を使用します

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

この行$phpdate = strtotime( $mysqldate )は文字列を受け取り、一連のヒューリスティックを実行してその文字列をUNIXタイムスタンプに変換します。

この行$mysqldate = date( 'Y-m-d H:i:s', $phpdate )は、そのタイムスタンプとPHPのdate関数を使用して、そのタイムスタンプをMySQLの標準日付形式に戻します。

編集者注:この回答は、紛らわしい文言の元の質問と、現在存在する質問に直接回答しなかったとしても、この回答が提供した一般的なGoogleの有用性のためにここにあります)


19
この回答はトピックを混乱させています
Alex K

5
@ 0xBAADF00D:もう一度質問を読んでください... MySQLの標準形式について誰も質問していません。
user7116 2013

3
もちろん、標準が存在する場合は、標準に準拠することをお
勧め

4
この質問では、「Ymd H:i:s」ではなく、mm / dd / yy H:M(AM / PM)の形式で出力するように求められます。
Rikki

6
does not work誰のために?変換したい場合は受け入れ答えは動作しますからへのMySQL MM / DD / YY H:M(AM / PM) OPが要求されるように。反対のことをしたいからといって、受け入れられた答えを間違ったものにすることはありません。
toxalot 2014年

311

MySQLから取得した日付を要求された形式(mm/dd/yy H:M (AM/PM))に変換するには:

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

フォーマットを調整するには、PHP日付フォーマットオプションを参照してください。


この$rowオブジェクトの出所はどこですか?
Mike

25
私は間違っているかもしれませんが、あなたの一部は要点を逃していると思います。彼は、出力を "m / d / yg:i A"形式にして、DATETIMEフィールドから元の日付を引き出​​したいと考えています。したがって、彼のコードは機能します。@Mike $ row-> createdateは、Timの日時列です。
単なる開発

4
@AsTeRの回答は、質問を誤って読んだ場合にのみ混乱します。OPが独自の質問に回答し MySQL から日付を取得して、要求された形式mm / dd / yy H:M(AM / PM)に出力したいと考えています。
toxalot 2014年

@TimBoland fromが強調され、要求された形式がmm / dd / yy H:M(AM / PM)の場合回答が改善されると思います。そして、それは日付関数へのリンクから利益を得るかもしれません。編集提案しようとしましたが、拒否されました。
toxalot 2014年

1
おもしろい事実:この回答は、下の回答とほぼ同等です(実質的に反対票はありません)。ただし、OPの質問に回答するため、40以上の反対票を獲得しました。これは、このページにアクセスした人が実際に持っている質問とは異なります。
クレメント14

110

PHP 5を使用している場合は、

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");

上記のコメントで述べたように、標準フォーマットは("Y-m-d H:i:s")
Yannickv '13

45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

リファレンス: http : //php.net/manual/en/function.date.php


OPの質問について混乱しているため、反対票を投じていると思います。ほとんどの人は、実際の問題とは正反対の質問を読んでいます。もう1つの可能性は、5年以上前に投稿された承認済みの回答と非常に似ていることです。
toxalot 2014年

1
参照するリンクは、使用している関数を指すものではなく、形式についても説明していません。php.net/function.date.phpの方がいいと思います。
toxalot 2014年

@toxalot受け入れられた答えは間違っています。それは私の答えの後に編集し、私のリンクについて私はあなたのリンクを置き換えます。ありがとう
トニー・スターク

1
このQ&A全体の歴史はひどいものです。2013年4月29日から2013年5月24日の間に、受け入れられた回答間違っていました。最初に回答を投稿したときは、正解でした。あなたの答え 2013年5月29日まで間違っていました。その後、それは受け入れられた答えと非常によく似たものになりました。
toxalot 2014

23

最後に、PHP 5.3以降の適切なソリューション:( コメントに記載されているように、例にオプションのタイムゾーンを追加しました)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');

そのエラー.. Class 'App \ Controller \ DateTime' not found ..using php 6.4
aswzen

1
あなたが別の名前空間で作業している場合、あなたはそれの前にバックスラッシュでそれを呼び出す必要があります:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester

2
日付オブジェクトを作成するときにタイムゾーンを指定することを忘れないでください!そうしないと、フォーマットされた日付が数時間ずれる可能性があります。あなたのdatetime列はUTF8であるので、渡す必要がありますnew DateTimeZone('UTC')PHPが知っていることを確認するために3番目のパラメータとして。
Eric Seastrand

これは、OPの目的の形式を出力する正解です。タイムゾーンに注意してください
会計士1983

12

より簡単な方法は、PHPではなくMySQLクエリで直接日付をフォーマットすることです。DATE_FORMATのMySQLマニュアルエントリを参照してください。

PHPで実行する場合は、date関数が必要ですが、最初にデータベースの値をタイムスタンプに変換する必要があります。


11
-1 DBでの日付のフォーマットはお勧めできません。多言語ウェブには異なる日付形式が必要であり、PHP(ビジネスロジック言語共通)で日付をフォーマットする必要があります。date関数について書いたときはstrottime、「データベースの値を最初にタイムスタンプに変換する必要があります」ではなく、誰かを助けるために関数についても書く必要があります。
BorisŠuška2013

10

すべて忘れて。ただ使用する:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))

9

DateTimeMySQLに保存するためにPHPでオブジェクトを正しくフォーマットするには、MySQLが使用する標準化されたフォーマット(ISO 8601)を使用します。

PHPでは、バージョン5.1.1以降、この形式が定数として保存されているため、毎回手動で文字列を入力するのではなく、この形式を使用することを強くお勧めします。

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

これと他のPHP DateTime定数のリストは、http://php.net/manual/en/class.datetime.php#datetime.constants.typesで入手できます。


MySQLは実際にはこの形式を使用せず、MySQLは、生成される「+ xxxx」タイムゾーン指定子を含めると警告を生成します。UPDATE X SET Y = '2014-03-31T15:00:00 + 0100' where Z; クエリは正常、0行が影響を受けた、1警告(0.06秒)一致した行:1変更:0警告:1
George Lund

OPはMySQL形式から日付を取得し、mm / dd / yy H:M(AM / PM)に変換 たいと考えています。
toxalot 2014年

8

これにより、SQLクエリのフィールドがフォーマットされます。

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename

SQLだけでなく、MySQLクエリを指定する必要があります。これは、必ずしもすべてのデータベースで機能するわけではないためです。OPがPHPソリューションを要求しましたが、これはOPが知らなかったかもしれない良い代替手段です。ただし、これは要求された形式を提供しません。要求されたフォーマットOPを取得するには、が必要'%m/%d/%y %h:%i %p'です。
toxalot 2014年


5

MySQLの日時構成によって異なります。通常:2011-12-31 07:55:13形式。この非常にシンプルな関数が魔法をかけるはずです:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

または、質問と一致するように少し進んでください。

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}

1
これはOPの質問には答えません。OPはMySQL形式から日付を取得し、mm / dd / yy H:M(AM / PM)に変換 たいと考えています。さらに、これは特定の日付ではなく、現在の時刻をフォーマットするだけです。
toxalot 2014年

5
SELECT 
 DATE_FORMAT(demo.dateFrom, '%e.%M.%Y') as dateFrom,
 DATE_FORMAT(demo.dateUntil, '%e.%M.%Y') as dateUntil
FROM demo

PHPコードのすべての関数を変更したくない場合は、期待される日付形式を表示するには、ソース(データベース)で変更してください。

上記の例のように、as演算子を使用して行に名前を付けることが重要です(dateFrom、as dateUntil)。そこに書き込む名前は名前であり、行は結果で呼び出されます。

この例の出力は次のようになります

[月の日、数値(0..31)]。[月の名前(January..December)]。[年、数値、4桁の数字]

例:5.2015年8月

選択した区切り記号でドットを変更し、DATE_FORMAT(date、format)関数で他の日付形式を確認します。


3

クエリで時間をUnixタイムスタンプとして返​​すこともできます。それは呼び出す必要性を取り除きstrtotime()、PHP側で物事を少し集中的にします...

select  UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234;

次に、PHPではdate()関数を使用して、好きなようにフォーマットします。

<?php
  echo date('l jS \of F Y h:i:s A', $row->unixtime);
?>

または

<?php
  echo date('F j, Y, g:i a', $row->unixtime);
?>

MySQLDATE_FORMAT関数を使用するのではなく、このアプローチが好きです。同じクエリを再利用してデータを取得し、PHPのフォーマットを変更できるからです。

UIでの日付の表示方法を変更するためだけに2つの異なるクエリを使用するのは面倒です。


UNIX_TIMESTAMPの必要性を排除するためにを使用するアイデアが気に入っていstrtotimeます。この答えは、OPが実際に要求する形式で時間をフォーマットする例を示している場合に適しています。
toxalot 2014年

1

Unixタイムスタンプで返されない日付で問題が発生する可能性があるため、これは私にとってはうまくいきます...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))

1
これは日付をOPが要求する形式に変換しません。
toxalot 2014年

1

これは動作します...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));

1
この形式では、24時間とAM / PMが混在しています。それ以外の場合は、5年以上前に投稿された承認済みの回答と同じです。
toxalot 2014年

0

PHPバージョン4.4.9とMySQL 5.0を使用して、これは私のために働きました:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDateMySQLの列です。


これは、日付をOPによって要求された形式に変換しません
toxalot

0

私が提案するアプローチは次のように機能します。最初に、mysql形式の文字列から基本的な日時オブジェクトを作成します。そして、それを好きなようにフォーマットします。幸い、mysqlのdatetimeはISO8601に準拠しているため、コード自体は非常にシンプルでエレガントに見えます。ただし、このdatetime列にはタイムゾーン情報がないため、適切に変換する必要があります

これがコードです:

(new ISO8601Formatted(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

それは出力します01/19/2038 11:14AM-うまくいけばあなたが期待するもの。

この例では、メレンゲライブラリを使用しています。あなたはできることのいくつかのより多くをチェックアウトします空想場合。


-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

1
これはOPの質問には答えません。OPはMySQL形式から日付を取得し、mm / dd / yy H:M(AM / PM)に変換 たいと考えています。これは反対です。さらに、データベースではなくフォームから入力を受け取ります。
toxalot 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.