是否有一种PHP函数可以像MySQL函数NOW()一样返回日期和时间,以相同的格式?
我知道可以使用date()来完成,但我想知道是否有专门用于此目的的函数。
例如,返回:
2009-12-01 00:00:00
date('Y-m-d H:i:s')
在这里查看更多详细信息:http://pl.php.net/manual/en/function.date.php
2022-11-30 12:00:250
。 - Anton Duzenko使用此函数:
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');
}
简短回答
$now = date_create()->format('Y-m-d H:i:s');
阅读下面的长篇回答。
模拟MySQL NOW()函数的PHP方法
以下是在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
使用 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()
相比date()
的优点详解
请继续阅读详细解释。
O.O.P.
date_create()
函数是DateTime
对象的构造函数。该对象的文档为程序员提供了一个快速概述,描述了可能性。
文档:https://www.php.net/manual/en/class.datetime.php
date()
函数只返回一个字符串。
我对可用性的偏好在于O.O.P。
更容易处理时间操作
date_create()
接受一个相对日期/时间格式(如now
,yesterday
或+1 day
),请参见this link,例如:
$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
中的默认时区,在date.timezone
指令下进行配置。链接:http://php.net/manual/en/datetime.configuration.php#ini.date.timezone。date_default_timezone_set('Asia/Tokyo');
。date_create()->format()
与timezone_open()
组合,则不存在这个问题。$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'),
);
create_date
接受时区参数:create_date('now', new DateTimeZone('Europe/Athens'))
- https://www.php.net/manual/en/function.date-create.php - Wtower试试这个:
date("Y-m-d H:i:s");
我正在寻找同样的答案,并且我已经找到了适用于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");
我发现另外一个容易使用的答案:
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://dev59.com/OmUq5IYBdhLWcg3wSOjS#35944059。但这也意味着将保存到数据库中时将丢失时区信息!
默认情况下,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
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
MySQL函数NOW()
返回当前时间戳。我发现PHP的唯一方法是使用以下代码。
MySQL函数NOW()
返回当前时间戳。我发现PHP的唯一方法是使用以下代码。
$curr_timestamp = date('Y-m-d H:i:s');
date_default_timezone_set
函数。 - Michel Ayres