PHPのNOW()関数


479

MySQL関数と同じ形式で日付と時刻を返すPHP関数はありますNOW()か?

私はそれを使ってそれを行う方法を知っていますdate()が、私はこれだけの機能があるかどうか尋ねています。

たとえば、返すには:

2009-12-01 00:00:00

2
良い質問。シンプルですが、すべてのプログラマーが覚えるのに苦労する以下のdateTimeソリューションを引き出すのに効果的です。
Sweet Chilly Philly

回答:



143
date('Y-m-d H:i:s')

詳細については、こちらをご覧ください:http : //pl.php.net/manual/en/function.date.php


3
2010年1月3日17:08にあなたと@troelsknの両方が同じ回答を送信した方法を強調したいと思います。あなたの回答の提出は、おそらく彼とは数秒離れていました。:)とにかくそれを書いてくれてありがとう:D
Aleksandar

9秒後(「回答済み」のラベルが付いている場合に表示)
Grzegorz Oledzki

110

PHPバージョン> = 5.4の場合、DateTimeは次のことを実行できます。

echo (new \DateTime())->format('Y-m-d H:i:s');

それが機能しているのを見てください


4
コンストラクターをラップし、正しい方法でフォーマットする素晴らしいアイデア。
acme 2013年

最後に、PHPでデルファイからコピーを開始し、C#:)
ErçinDedeoğlu

1
これはいいかもしれませんが、質問にまったく答えません。この方法で行うのは簡単でも速くもありません
Asped

8
@Aspedそれはどのように質問に答えませんか?これは、「MySQL関数NOW()と同じ形式で日付と時刻を返す」というPHP関数であり、これはまさに問題です。
vascowhite 2015年

@vascowhite-問題は、この1つの目的に特定の機能があるかどうかでした。だから答えはノーです。すでに尋ねる男はどのようにそれを行う方法を知っていたが、より簡単に、単一目的の機能、あなたではありません:)たかったように、ここに記載されている他のすべての可能性が作業することができるとあなたも素敵ですが、助けをしません
2015年

34

この関数を使用します。

function getDatetimeNow() {
    $tz_object = new DateTimeZone('Brazil/East');
    //date_default_timezone_set('Brazil/East');

    $datetime = new DateTime();
    $datetime->setTimezone($tz_object);
    return $datetime->format('Y\-m\-d\ h:i:s');
}

25

これを試して:

date("Y-m-d H:i:s");

181
そう、あなたがそのようなキャラクターを無駄にしたら、私たちはそれらを使い果たすでしょう。
Bill Karwin、2010年

4
うん私の悪い時間は、()actualy必要とされていません
streetparade

15
実際には8文字です。
Henrik Erlandsson 2013年

52
この辺りの無駄をすべて考えると、彼が二重引用符を使用したのはかなり恥ずかしいと思います
Augie Gardner '25 / 07/25

37
キャラクターの無駄にコメントすることで無駄にされているすべてのキャラクターを想像してみてください!
Pwnball 14

25

簡潔な答え

$now = date_create()->format('Y-m-d H:i:s');

長い答えについては、以下をお読みください。




PHPのMySQL NOW()関数の模倣

以下は、MySQL NOW()関数を模倣するPHPの方法のリストです。

// relative date
$now = date_create('now')->format('Y-m-d H:i:s'); // works in php 5.2 and higher  
$now = date_create()->format('Y-m-d H:i:s'); // also works in php 5.2
$now = new DateTime('now')->format('Y-m-d H:i:s'); // syntax error!!!
$now = (new DateTime('now'))->format('Y-m-d H:i:s'); // works in php 5.4 and higher   
$now = date('Y-m-d H:i:s'); // Slightly higher performance, but less usable for date/time manipulations

// From Unix timestamp
// Using date_create() with a Unix timestamp will give you a FALSE,  
// and if you try to invoke format() on a FALSE then you'll get a: 
//     Fatal error: Call to a member function format() on boolean 
// So if you work with Unix timestamps then you could use: date_create_from_format().
$unixTimeStamp = 1420070400; // 01/01/2015 00:00:00
$y2015 = date_create_from_format('U', $unixTimeStamp, timezone_open('Europe/Amsterdam'))->format('Y-m-d H:i:s');
$y2015 = date('Y-m-d H:i:s', $unixTimeStamp);

date_create()->format('Y-m-d H:i:s')このアプローチは時間/タイムゾーンの操作をより簡単に処理できdate('Y-m-d H:i:s')、php 5.2以降で機能するため、これが最良の方法だと思います。


MySQL NOW()関数

MySQL関数NOW()は、dateTime値を次の形式で提供します'YYYY-MM-DD HH:MM:SS'。こちらをご覧くださいhttps : //dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now

興味深い事実は、次のクエリを実行することで日時形式を取得SHOW VARIABLES LIKE 'd%e_format'できることです。結果は次のようになります。

Variable_name     Value     
date_format       %Y-%m-%d
datetime_format   %Y-%m-%d %H:%i:%s

ここまでの変数は読み取り専用変数です。したがって、変更することはできません。

MySQL NOW()関数はdatetime_format変数からフォーマットを取得すると思います。




date_)ではなくdate_create()-> format()の利点

有利な事実date_create('now')->format('Y-m-d H:i:s')の上にはdate('Y-m-d H:i:s')、次のとおりです。

  • 時間操作をより簡単に処理する
  • タイムゾーンの扱いが簡単
  • おっと

date_)の代わりにdate_create()-> format()の欠点

関数のdate()パフォーマンスはよりもわずかに優れていますdate_create()->format()。以下のベンチマークテストを参照してください。

$start = time();
for ($i = 0; $i <= 5000000; $i++) {
    $a = date_create('now')->format('Y-m-d H:i:s');
}
$end = time();                  
$elapsedTimeA = $end - $start;

echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';

$start = time();
for ($i = 0; $i <= 5000000; $i++) {
    $b = date('Y-m-d H:i:s');
}
$end = time();                   
$elapsedTimeB = $end - $start;

echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 31
Case B, elapsed time in seconds: 14

大文字はそれdate()が速いことを示しています。ただし、テストシナリオを少し変更すると、結果は異なります。下記参照:

$start = time();
$dt = date_create('now');
for ($i = 0; $i <= 5000000; $i++) {
    $a = $dt->format('Y-m-d H:i:s');
}
$end = time();                  
$elapsedTimeA = $end - $start;

echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';

$start = time();
for ($i = 0; $i <= 5000000; $i++) {
    $b = date('Y-m-d H:i:s');
}
$end = time();                   
$elapsedTimeB = $end - $start;

echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 14
Case B, elapsed time in seconds: 15

DateTimeメソッド:format()ここではが高速ですdate()




date()の代わりにdate_create()-> format()の利点詳細

詳細な説明については、以下をお読みください。

時間操作をより簡単に処理する

date_create()相対的な日付/時刻フォーマットを受け付ける(等nowyesterdayまたは+1 day参照)このリンクを、例:

$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s'); 

date() 次のように、相対日付/時刻形式も受け入れます。

$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));
$tomorrow = date('Y-m-d H:i:s', (time() + 86400)); // 86400 seconds = 1 day

タイムゾーンの扱いが簡単

タイムゾーンが重要な場合、ディレクティブで設定されているデフォルトのタイムゾーンを使用するので、の使用はdate_create()->format()より意味があります。リンク:http : //php.net/manual/en/datetime.configuration.php#ini.date.timezonedate()date()php.inidate.timezone

ランタイム中にタイムゾーンを変更することが可能です。例:

date_default_timezone_set('Asia/Tokyo');

その欠点は、すべての日付/時刻関数に影響を与えることです。date_create()->format()と組み合わせて使用している場合、この問題は発生しませんtimezone_open()

PHPは主要なタイムゾーンをサポートしています。おもしろいのは、それが北極圏と南極大陸さえもサポートするということです。聞いたことがありLongyearbyenますか?そうでない場合でも、心配する必要はありません。PHPの公式ドキュメントを読むまで、私も気にしませんでした。

$nowLongyearbyen = date_create('now', timezone_open('Arctic/Longyearbyen'))->format('Y-m-d H:i:s');

サポートされているすべてのタイムゾーンのリストを参照してください:http : //php.net/manual/en/timezones.php

おっと

OOPはステートフルオブジェクトを使用します。だから私はこのように考えることを好む:

// Create a DateTime Object. 
// Use the DateTime that applies for tomorrow.
// Give me the datetime in format 'Y-m-d H:i:s'
$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s'); 

次に、このように考える:

// Give me a date time string in format 'Y-m-d H:i:s', 
// use strtotime() to calculate the Unix timestamp that applies for tomorrow.
$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));

したがって、このdate_create()->format()アプローチは私にとって読みやすいと言えdate()ます。




date_create()VS新しいDateTime()

有利な事実date_create()の上にはnew DateTime()、次のとおりです。

  • 名前空間

名前空間

名前空間で作業していて、新しいキーワードでDateTimeオブジェクトを初期化する場合は、次のようにする必要があります。

namespace my_namespace;

// The backslash must be used if you are in a namespace.
// Forgetting about the backslash results in a fatal error.
$dt = new \DateTime();

これには何の問題もありませんが、上記の欠点は、バックスラッシュを散発的に忘れることです。date_create()コンストラクター関数を使用することで、名前空間について心配する必要はありません。

$dt = date_create(); // in or not in a namespace it works in both situations




date_create()-> format()の例

配列を埋める必要がある場合は、この方法をプロジェクトに使用します。このような:

$array = array(
    'name' => 'John',
    'date_time' => date_create('now')->format('Y-m-d H:i:s'), // uses the default timezone
    'date_time_japan' => date_create('now', timezone_open('Asia/Tokyo'))->format('Y-m-d H:i:s'),
);

18

私は同じ答えを探していました、そして私はPHP 5.3以降のためにこの解決策を考え出しました:

$dtz = new DateTimeZone("Europe/Madrid"); //Your timezone
$now = new DateTime(date("Y-m-d"), $dtz);
echo $now->format("Y-m-d H:i:s");

16

MySQL関数NOW()は現在のタイムスタンプを返します。PHPで見つけた唯一の方法は、次のコードを使用することです。

$curr_timestamp = date('Y-m-d H:i:s');

16

私が使いやすいと思うもう一つの答え:

echo date('c');

// 2015-07-27T00:00:00+02:00

これは、MySQLが使用するISO 8601日付(PHP 5で追加)です

編集する

MySQL 5.7では、デフォルトで日時のタイムゾーンは許可されていません。エラーはで無効にできますSQL_MODE=ALLOW_INVALID_DATES。詳細については、https//stackoverflow.com/a/35944059/2103434の回答をご覧くださいしかし、それはデータベースに保存するときにタイムゾーンが失われることも意味します!

デフォルトでは、MySQLはシステムのタイムゾーンを使用ます。PHP同じタイムゾーンを使用している限り、問題はありません。私の場合、CET / UTC + 2。

これは2015-07-27T00:00:00+02:00、データベースに挿入した場合にのみ2015-07-27T00:00:00保存されることを意味します(ただし、これは正しい現地時間です!)。

時間をPHPにロードし直すと、

$importedDate = new \DateTime('2015-07-27T00:00:00')

+02:00デフォルトなので、自動的にタイムゾーンと見なされます。これを印刷すると再び正しくなります:

echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00

安全のために、常にサーバーでUTCを使用し、MySQLとPHPでそれを指定して、日付を表示するときにユーザーのロケールにのみ変換します。

date_default_timezone_set('UTC');
$importedDate = new \DateTime('2015-07-27T00:00:00+02:00');
echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00

$importedDate->setTimezone(new \DateTimeZone("America/New_York"));
echo $importedDate->format('c');
// 2015-07-26T18:00:00-04:00


11

または、DateTime定数を使用できます。

echo date(DateTime::W3C); // 2005-08-15T15:52:01+00:00

それらのリストは次のとおりです。

ATOM = "Y-m-d\TH:i:sP" ;               // -> 2005-08-15T15:52:01+00:00
COOKIE = "l, d-M-Y H:i:s T" ;          // -> Monday, 15-Aug-2005 15:52:01 UTC
ISO8601 = "Y-m-d\TH:i:sO" ;            // -> 2005-08-15T15:52:01+0000
RFC822 = "D, d M y H:i:s O" ;          // -> Mon, 15 Aug 05 15:52:01 +0000
RFC850 = "l, d-M-y H:i:s T" ;          // -> Monday, 15-Aug-05 15:52:01 UTC
RFC1036 = "D, d M y H:i:s O" ;         // -> Mon, 15 Aug 05 15:52:01 +0000
RFC1123 = "D, d M Y H:i:s O" ;         // -> Mon, 15 Aug 2005 15:52:01 +0000
RFC2822 = "D, d M Y H:i:s O" ;         // -> Mon, 15 Aug 2005 15:52:01 +0000
RFC3339 = "Y-m-d\TH:i:sP" ;            // -> 2005-08-15T15:52:01+00:00 ( == ATOM)
RFC3339_EXTENDED = "Y-m-d\TH:i:s.vP" ; // -> 2005-08-15T15:52:01.000+00:00
RSS = "D, d M Y H:i:s O" ;             // -> Mon, 15 Aug 2005 15:52:01 +0000
W3C = "Y-m-d\TH:i:sP" ;                // -> 2005-08-15T15:52:01+00:00

デバッグのために私はより短いものを好む(3v4l.org):

echo date('ymd\THisP'); // 180614T120708+02:00

6

私はuser1786647によって投稿されたソリューションを気に入っています。タイムゾーンを関数の引数に変更し、返される日付スタンプに使用するUnix時間または日時文字列を渡すオプションのサポートを追加するために少し更新しました。

また、PHP 5.3より前のバージョンを実行しているユーザーのための「setTimestamp」のフォールバックも含まれています。

function DateStamp($strDateTime = null, $strTimeZone = "Europe/London") {
    $objTimeZone = new DateTimeZone($strTimeZone);

    $objDateTime = new DateTime();
    $objDateTime->setTimezone($objTimeZone);

    if (!empty($strDateTime)) {
        $fltUnixTime = (is_string($strDateTime)) ? strtotime($strDateTime) : $strDateTime;

        if (method_exists($objDateTime, "setTimestamp")) {
            $objDateTime->setTimestamp($fltUnixTime);
        }
        else {
            $arrDate = getdate($fltUnixTime);
            $objDateTime->setDate($arrDate['year'], $arrDate['mon'], $arrDate['mday']);
            $objDateTime->setTime($arrDate['hours'], $arrDate['minutes'], $arrDate['seconds']);
        }
    }
    return $objDateTime->format("Y-m-d H:i:s");
}

6

PHP日付関数をパラメーターとして正しい形式で使用できます。

echo date("Y-m-d H:i:s");

1

組み込みのPHP now()関数はありませんが、を使用して実行できますdate()

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

date_default_timezone_set()タイムゾーンを変更する必要がある場合に使用できます。

それ以外の場合は、Carbon -DateTime用の単純なPHP API拡張を利用できます。


0

AM / PMを含む今すぐ時間を取得したい場合

<?php 
    $time_now = date("Y-m-d h:i:s a");
    echo $time_now;
?>

出力します 2020-05-01 05:45:28 pm

または

<?php 
    $time_now = date("Y-m-d h:i:s A");
    echo $time_now;
?>

出力します 2020-05-01 05:45:28 PM


-1

まもなく

echo date('Y-m-d H:i:s');

php advanced now class extra addMinute addYear as such addHour etc ...

<?php /** @noinspection PhpUnhandledExceptionInspection */

/**
 * Class Now
 * @author  dılo sürücü <berxudar@gmail.com>
 */
class Now
{

    /**
     * @var DateTime
     */
    private $dateTime;

    /**
     * Now constructor.
     * @throws Exception
     */
    public function __construct()
    {
        $this->dateTime = new DateTime('now');
    }


    /**
     * @param int $year
     * @return Now
     * @throws Exception
     * @noinspection PhpUnused
     */
    public function addYear(int $year): self
    {
        $this->dateTime->add(new DateInterval('P' . $year . 'Y'));

        return $this;
    }

    /**
     * @noinspection PhpUnused
     * @param int $month
     * @return Now
     * @throws Exception
     * @noinspection PhpUnused
     */
    public function addMonth(int $month):self 
    {
        $this->dateTime->add(new DateInterval('P' . $month . 'M'));

        return $this;
    }

    /**
     * @param int $day
     * @return $this
     * @throws Exception
     */
    public function addDay(int $day): self
    {
        $this->dateTime->add(new DateInterval('P' . $day . 'D'));
        return $this;
    }

    /**
     * @noinspection PhpUnused
     * @param int $week
     * @return $this
     * @throws Exception
     */
    public function addWeek(int $week): self
    {
        return $this->addDay($week * 7);
    }

    /**
     * @noinspection PhpUnused
     * @param int $second
     * @return $this
     * @throws Exception
     */
    public function addSecond(int $second): self
    {
        $this->dateTime->add(new DateInterval('PT' . $second . 'S'));
        return $this;
    }

    /**
     * @param int $minute
     * @return $this
     * @throws Exception
     */
    public function addMinute(int $minute): self
    {
        $this->dateTime->add(new DateInterval('PT' . $minute . 'M'));
        return $this;
    }

    /**
     * @param int $hour
     * @return $this
     * @throws Exception
     */
    public function addHour(int $hour): self
    {
        $this->dateTime->add(new DateInterval('PT' . $hour . 'H'));
        return $this;
    }


    /**
     * @return string
     */
    public function get(): string
    {
        return $this->dateTime->format('Y-m-d H:i:s');
    }

    /**
     * @return string
     */
    public function __toString()
    {
        return $this->get();
    }

}


/**
 * @return Now
 * @throws Exception
 */
function now()
{
    return new Now();

}




を使用して

  echo now(); //2020-03-10 22:10


echo now()->addDay(1); //2020-03-11 22:10


echo now()->addDay(1)->addHour(1); // //2020-03-11 23:10


echo now()->addDay(1)->addHour(1)->addMinute(30); // //2020-03-11 23:40


echo now()->addDay(1)->addHour(1)->addMinute(30)->addSecond(10); // //2020-03-11 23:50

//or u can use get method for example

echo now()->addDay(1)->addHour(1)->addMinute(30)->get(); // //2020-03-11 23:40

なぜ1行のコードで完全に満足できる何かのためにクラス全体が必要なのでしょうか?!?このTLDRに何か価値がある場合、それは間違った質問に対する正しい答えです。
mickmackusa

今すぐオブジェクト毎回あるので
dılosürücü

OPは特定のフォーマットされた日付文字列のみを要求しました。これ以上何もない。日付/時刻の操作はありません。これは間違った質問に対する正しい答えです。
mickmackusa

ı編集したコードを繰り返しコードを見てください
–dılosürücü

あなたの編集により、このページの上位5つの回答のうち3つから提案された解決策がコピーされました。ページの肥大化(冗長コンテンツと範囲外のアドバイス)に関与しているため、Stackoverflowには適していません。
mickmackusa

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.