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

我知道如何使用date()来做到这一点,但我在问是否有一个函数仅用于此。

例如,返回:

2009-12-01 00:00:00

当前回答

不久

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

其他回答

你可以使用正确格式的PHP日期函数作为参数,

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

简短的回答

$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()->格式('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。

一个有趣的事实是,可以通过运行这个查询来获得datetime格式: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() summary的优点

date_create('now')->格式('Y-m-d H:i:s')比date('Y-m-d H:i:s')的优点是:

O.O.P. 更容易处理时间操作 更容易处理时区

使用date_create()->format()代替date()摘要的缺点

Date()性能稍好




详细说明了使用date_create()->format()代替date()的优点

请继续阅读详细的解释。

O.O.P.

函数date_create()是DateTime对象的构造函数。该对象的文档为程序员提供了描述可能性的快速视图。 文档:https://www.php.net/manual/en/class.datetime.php

函数date()只是给你一个字符串。

我对可用性的品味是O.O.P.

更容易处理时间操作

Date_create()接受一个相对的日期/时间格式(比如现在,昨天或+1天),请看这个链接,示例:

$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.ini中配置的默认时区。时区指令。链接:http://php.net/manual/en/datetime.configuration.php#ini.date.timezone。

可以在运行时更改时区。例子:

作用(“亚洲/东京”);。

这样做的缺点是它将影响所有日期/时间函数。如果您将date_create()->format()与timezone_open()结合使用,则不存在此问题。

PHP支持主要时区。有趣的是,它甚至支持北极圈和南极洲。你听说过朗伊尔城吗?如果没有,那么不要担心,在我阅读官方PHP文档之前,我也没有。这重要吗?嗯…是的,如果你经营一个国际电子商务平台,并且做一些与当地时间挂钩的事情,例如:计算交货日期-时间。

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

查看所有支持的时区列表: http://php.net/manual/en/timezones.php。

date_create() VS new 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()代替date()的缺点

函数date()的性能略好于date_create()->format()。但是,只有在实例化DateTime数百万次时,它才可见。这在现实生活中可能永远不会发生。然而,下面是基准测试:

$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 date_create(), 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 date(), elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case date_create(), elapsed time in seconds: 31
Case date(), elapsed time in seconds: 14



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'),
);

你可以使用date函数:

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

更多详情请点击这里:http://pl.php.net/manual/en/function.date.php

我喜欢user1786647发布的解决方案,我对它进行了一些更新,将timezone更改为一个函数参数,并添加了可选的支持,可以传递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");
}