PHP中的NOW()函数

Moe*_*ine 461 php time datetime timestamp

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

我知道如何使用它date(),但我问是否只有这个功能.

例如返回:

2009-12-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

tro*_*skn 977

除此之外:

date("Y-m-d H:i:s");
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您可能需要使用[`date_default_timezone_set`](http://php.net/manual/en/function.date-default-timezone-set.php)函数 (52认同)

hsz*_*hsz 139

date('Y-m-d H:i:s')
Run Code Online (Sandbox Code Playgroud)

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

  • 9 秒后(将鼠标悬停在“已回答”标签上即可看到) (3认同)
  • 我想强调一下,您和@troelskn在2010年1月3日如何发送相同的答案。在17:08,但他仍然获得了大约800票赞成。您提交的答案可能与他相隔几秒钟。:)谢谢你仍然写它:D (2认同)

vas*_*ite 108

PHP版本> = 5.4 DateTime可以这样做: -

echo (new \DateTime())->format('Y-m-d H:i:s');
Run Code Online (Sandbox Code Playgroud)

看它工作.

  • @Asped以什么方式不回答这个问题?它是一个PHP函数,"以与MySQL函数NOW()相同的格式返回日期和时间",这正是问题所在. (7认同)
  • 包装构造函数并将其格式化的好主意. (4认同)

use*_*647 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');
}
Run Code Online (Sandbox Code Playgroud)


str*_*ade 25

试试这个:

date("Y-m-d H:i:s");
Run Code Online (Sandbox Code Playgroud)

  • 是的,如果你浪费这样的字符,我们就会用完它们. (181认同)
  • 考虑到这里的所有浪费,我发现他使用双引号是非常可耻的 (52认同)
  • 想象一下,所有角色都浪费在评论浪费角色上! (37认同)
  • 实际上是8个字符. (15认同)
  • 你真的不需要第二个参数....浪费6个字符IMO. (9认同)
  • 是的,我的坏时间()实际上是不需要的 (4认同)
  • 你是浪子!你为什么不使用strftime("%F%T"); 并保存一堆10个字符? (3认同)

Jul*_*ian 25

简短的回答

$now = date_create()->format('Y-m-d H:i:s');
Run Code Online (Sandbox Code Playgroud)

请阅读下面的长篇答案.




用PHP模仿

要模仿NOW()PHP中的MySQL 函数,您可以使用date_create()->format('Y-m-d H:i:s').这种方法可以让您更轻松地处理时间/时区操作date('Y-m-d H:i:s').它更具可读性,并且自php 5.2起它可以工作.

// 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'); // works as well, but it's less nice then date_create()

// 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);
Run Code Online (Sandbox Code Playgroud)

这之所以有效,是因为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'结果可能是这样的:

Variable_name     Value     
date_format       %Y-%m-%d
datetime_format   %Y-%m-%d %H:%i:%s
Run Code Online (Sandbox Code Playgroud)

这里的变量是只读变量.所以你无法改变它.我想MySQL NOW()函数从datetime_format变量中获取它的格式.


date_create() - > format()VS date()

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

  • 更容易处理时间操作
  • 更容易处理时区
  • 更多的oop

更容易处理时间操作

date_create()接受相对日期/时间格式(如now,yesterday+1 day)查看此链接,例如:

$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s'); 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

更容易处理时区

当时区很重要时,使用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吗?如果没有,那就不要担心,5分钟前我也没有听说过.但是,这里的好处是PHP知道date_create()->format().

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

更多的oop

OOP使用状态完整的对象.所以我更喜欢用这种方式思考:

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

然后以这种方式思考:

// 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'); 
Run Code Online (Sandbox Code Playgroud)

因此,我会说这种date()方法对我来说更具可读性date_create().


date_create() - > format()的示例

如果我必须填充一个数组,我会将这种方法用于我的项目.像这样:

// 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'));
Run Code Online (Sandbox Code Playgroud)


san*_*nti 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");
Run Code Online (Sandbox Code Playgroud)


Shr*_*tre 16

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

$curr_timestamp = date('Y-m-d H:i:s');
Run Code Online (Sandbox Code Playgroud)


小智 15

用途strftime:

strftime("%F %T");
Run Code Online (Sandbox Code Playgroud)
  • %F是一样的%Y-%m-%d.

  • %T是一样的%H:%M:%S.

这是关于ideone 的演示.


Ric*_*d87 14

我发现一个易于使用的答案:

echo date('c');

// 2015-07-27T00:00:00+02:00
Run Code Online (Sandbox Code Playgroud)

这是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')
Run Code Online (Sandbox Code Playgroud)

它将自动假设它的+02:00时区,因为它是默认值.打印这个将再次正确:

echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00
Run Code Online (Sandbox Code Playgroud)

为了安全起见,请始终在服务器上使用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
Run Code Online (Sandbox Code Playgroud)


CPH*_*hon 11

或者你可以使用DateTime常量:

echo date(DateTime::W3C); // 2005-08-15T15:52:01+00:00
Run Code Online (Sandbox Code Playgroud)

这是他们的清单:

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
Run Code Online (Sandbox Code Playgroud)

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

echo date('ymd\THisP'); // 180614T120708+02:00
Run Code Online (Sandbox Code Playgroud)


Set*_*eth 6

我喜欢user1786647发布的解决方案,我稍微更新了一下,将时区更改为函数参数,并添加了可选的支持,用于传递Unix时间或日期时间字符串以用于返回的日期戳.

对于运行低于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");
}
Run Code Online (Sandbox Code Playgroud)


小智 6

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

echo date("Y-m-d H:i:s");
Run Code Online (Sandbox Code Playgroud)


Mac*_*Mac 6

我的答案是多余的,但如果您是强迫症患者,以视觉为导向,并且您只需在代码中看到now关键字,请使用:

date( 'Y-m-d H:i:s', strtotime( 'now' ) );
Run Code Online (Sandbox Code Playgroud)