PHP中的NOW()函数

570

是否有一种PHP函数可以像MySQL函数NOW()一样返回日期和时间,以相同的格式?

我知道可以使用date()来完成,但我想知道是否有专门用于此目的的函数。

例如,返回:

2009-12-01 00:00:00
20个回答

1204
你可以使用date函数:
date("Y-m-d H:i:s");

65
请注意,您可能需要使用 date_default_timezone_set 函数。 - Michel Ayres
1
mysqli 中是否有一个名为 now() 的函数? - MindRoasterMir
1
不,他指的是MySQL(数据库)函数,而不是PHP的mysqli对象。 - user236800

175

11
我想强调一下,你和@troelskn在2010年1月3日的17:08同时发送了相同的答案,但是他获得了比你多大约800个赞。你们的答案提交时间可能只相差几秒钟。 :) 非常感谢你写下这个答案 :D - Aleksandar
4
9秒后(如果您将鼠标悬停在“已回答”标签上,则可见) - Grzegorz Oledzki
1
它将秒数打印为三位数字,即 2022-11-30 12:00:250 - Anton Duzenko

124

4
不错的想法,将构造函数进行包装并使其格式化正确。 - acme
1
这可能很好,但根本没有回答问题,用这种方式既不更容易也不更快。 - Asped
16
这个PHP函数会“以与MySQL函数NOW()相同的格式返回日期和时间”,这恰好回答了问题,“它”指的是什么? - vascowhite
1
Asped,其他答案也没有回答问题。发布问题的人已经知道date()函数了,他们只是重复了那个。至少这个答案带来了一些新东西。 - Relaxing In Cyprus
哦,你说得对,我没有考虑到实例化,我以为这是关于DateTime本身的。 - madz
显示剩余8条评论

43

使用此函数:

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

42

简短回答

$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

这里的变量是只读变量,所以你不能更改它。
我猜 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') 的有利点有:

  • 面向对象编程(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()接受一个相对日期/时间格式(如nowyesterday+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()组合,则不存在这个问题。
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

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

28

试试这个:

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

183
好的,如果你这样浪费字符,我们会用完它们的。 - Bill Karwin
4
没错,我的错,实际上不需要使用time()函数。 - streetparade
52
考虑到这里的所有浪费,我觉得他使用双引号非常可耻。 - Augie Gardner
4
你们这些浪费者!为什么不使用strftime("%F %T"); 以节约10个字符呢? - tozlu
38
想象一下所有的字符都被浪费在评论字符浪费上了! - Pwnball
显示剩余2条评论

21

我正在寻找同样的答案,并且我已经找到了适用于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");

19

我发现另外一个容易使用的答案:

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

为了安全起见,在服务器上始终使用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

16

MySQL函数NOW()返回当前时间戳。我发现PHP的唯一方法是使用以下代码。

MySQL函数NOW()返回当前时间戳。我发现PHP的唯一方法是使用以下代码。

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

15
使用 strftime:
strftime("%F %T");
  • %F%Y-%m-%d相同。

  • %T%H:%M:%S相同。

这里是在ideone上的演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接