PHP中的NOW()函数

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

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

例如,返回:

2009-12-01 00:00:00
1919778 次浏览

你可以使用日期函数:

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

查看这里的更多细节:http://pl.php.net/manual/en/function.date.php

试试这个:

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

使用这个函数:

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

使用PHP版本>= 5.4 DateTime可以做到这一点

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

# EYZ0。

我喜欢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");
}

使用# EYZ1:

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

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

这是一个演示 on ideone。

我一直在寻找同样的答案,我已经为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");

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

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

还有一个我觉得很好用的答案:

echo date('c');


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

这是MySQL使用的ISO 8601日期(在PHP 5中添加)

编辑

MySQL 5.7默认不允许timezone在datetime中。您可以使用SQL_MODE=ALLOW_INVALID_DATES禁用错误。更多细节请参见这里的答案:https://stackoverflow.com/a/35944059/2103434 < a href = " https://stackoverflow.com/a/35944059/2103434 " > < / >。# EYZ2

默认情况下,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

简短的回答

$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()给出了如下格式的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'来获得datetime格式,结果可能是这样的:

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对象的构造函数。该对象的文档为程序员提供了描述可能性的快速视图。 文档:# EYZ0 < / p >

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

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

更容易处理时间操作

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

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

# EYZ0。

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

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

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

查看所有支持的时区列表: # EYZ0。< / p >

# eyz0 vs # eyz1

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

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

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

或者你可以使用# EYZ0常量:

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

对于调试,我更喜欢一个更短的(3 v4l.org):

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

PHP中没有内置的now()函数,但是可以使用date()来实现。

例子

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

如果需要更改时区,可以使用date_default_timezone_set()

否则,您可以使用 -一个简单的PHP API扩展DateTime。

不久

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

在PHP中,与MySQL的now()函数等价的逻辑是time()。

但是time()返回的Unix时间戳与MySQL DATETIME不同。

因此,必须将time()返回的Unix时间戳转换为MySQL格式。

你用: 日期(“Y-m-d H:我:s"); < / p >

但是date()函数中的time()在哪里呢?它是第二个参数:事实上,你应该为date()提供一个时间戳作为第二个参数,但如果省略它,它将默认为time()。

这是我能想到的最完整的答案。

问候。

你可能会发现这很有用

new \DateTime()

我的回答是多余的,但如果你是OCD,视觉导向,在你的代码中使用只需看到现在关键字,使用:

date( 'Y-m-d H:i:s', strtotime( 'now' ) );