PHP中的NOW()函数


479

是否有一个PHP函数以与MySQL函数相同的格式返回日期和时间NOW()

我知道如何使用来做date(),但是我在问是否只有一个功能。

例如,返回:

2009-12-01 00:00:00

2
好问题。简单但有效地提出了每个程序员都难以记住的以下dateTime解决方案。
Sweet Chilly Philly

Answers:



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

在这里查看更多详细信息:http : //pl.php.net/manual/en/function.date.php


3
我想强调一下,您和@troelskn在2010年1月3日如何发送相同的答案。在17:08,但他仍然获得了800多个投票。您提交的答案可能与他相隔几秒钟。:)谢谢您无论如何写它:D
Aleksandar

9秒后(如果您将鼠标悬停在标有“已回答”的标签上,则可见)
Grzegorz Oledzki

110

使用PHP版本> = 5.4 DateTime可以做到:

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

看到它工作


4
包装构造函数并正确格式化它的好主意。
acme 2013年

在最后的PHP开始从Delphi和C#:)复制
ErçinDedeoğlu

1
这可能很好,但根本无法回答问题,用这种方式做到既不容易也不快捷
Asped 2014年

8
@Asped用什么方式不能回答问题?这是一个PHP函数,“以与MySQL函数NOW()相同的格式返回日期和时间”,这正是问题所在。
vascowhite

@vascowhite-问题是是否为此目的有特定功能。所以答案是否定的。此处列出的所有其他可能性可能正在起作用,您的情况也不错,但无济于事,因为那个要问的人已经知道一种方法,但是想要一个更简单的,单一目的的功能,而您却不是:)
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

简短答案

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

请阅读以下详细答案。




PHP中MySQL NOW()函数的模仿

这是PHP中模仿MySQL NOW()函数的方式列表。

// 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()给出了这种格式的日期时间值:'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_create()-> format()代替date()摘要的优点

的有利的事实date_create('now')->format('Y-m-d H:i:s')date('Y-m-d H:i:s')是:

  • 更容易处理时间
  • 更容易处理时区
  • 哎呀

date_create()-> format()代替date()的缺点

该功能的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_create()-> format()代替date()的优点详细

请继续阅读以获取详细说明。

更容易处理时间

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()使得很多更有意义则date()是因为date()使用它在配置的默认时区php.inidate.timezone指令。链接:http : //php.net/manual/en/datetime.configuration.php#ini.date.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()是:

  • 命名空间

命名空间

如果您在命名空间中工作,并且想使用new关键字初始化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默认情况下不允许datetime中的时区。您可以使用禁用错误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时间或datetime字符串以用于返回的日期戳的可选支持。

它还为运行低于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高级现在类额外的addMinute addYear如addHour等...

<?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

为什么有人需要整个类才能用一行代码完全满足呢?!如果此TLDR中的任何内容有价值,那么它是对错误问题的正确答案。
mickmackusa

因为现在是对象每次
DILOsürücü

OP仅要求提供特定的格式化日期字符串。而已。没有日期/时间操作。这是对错误问题的正确答案。
mickmackusa

我编辑的代码重复看代码...
DILOsürücü

您的编辑已从本页的前5个答案中的3个中复制了建议的解决方案。您正在为页面膨胀(冗余内容和超出范围的建议)做出贡献,这对Stackoverflow不利。
mickmackusa

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.