首页 文章

PHP中的NOW()函数

提问于
浏览
417

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

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

例如返回:

2009-12-01 00:00:00

14 回答

  • 126

    使用strftime

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

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

    这是关于ideone的a demo .

  • 24

    我正在寻找相同的答案,我已经为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");
    
  • 17

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

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

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

    或者您可以使用DateTime constants

    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
    

    为了调试我喜欢更短的(3v4l.org):

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

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

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

    试试这个:

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

    Short answer

    $now = date_create()->format('Y-m-d H:i:s');
    

    请阅读下面的长篇答案 .




    Mimicry in PHP

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

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

    之所以能正常工作是因为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:%
    

    这里的变量是只读变量 . 所以你无法改变它 . 我想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') 的有利事实是:

    • 更容易处理时间操作

    • 更容易处理时区

    • more o.o.p.

    easier to handle time manipulations

    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
    

    easier to handle timezones

    当时区很重要时, date_create()->format() 的使用比 date() 更有意义,因为 date() 使用在 date.timezone 指令的 php.ini 中配置的默认时区 . (链接: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知道 Arctic/Longyearbyen .

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

    more o.o.p.

    O.O.P.使用state-full Object . 所以我更喜欢用这种方式思考:

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

    然后以这种方式思考:

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

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


    Example of 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'),
    );
    
  • 15
    date('Y-m-d H:i:s')
    

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

  • 5

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

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

    See it working .

  • -2

    使用此功能:

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

    除此之外:

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

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

    echo date('c'); 
    
    // 2015-07-27T00:00:00+02:00
    

    这是MySQL使用的 ISO 8601 date (added in PHP 5)

    编辑

    MySQL 5.7默认情况下不允许在datetime中使用时区 . 您可以使用 SQL_MODE=ALLOW_INVALID_DATES 禁用错误,请在此处获取更多详细信息:https://stackoverflow.com/a/35944059/2103434 But that also means that the timezone will be lost when saving to the database!

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

    您可以使用simplePHP类来执行此操作:

    echo $date->now();
    

    该类还提供了许多用于日期添加,减法和比较的有用方法 . 您可以check the tutorials page获取更多示例 .

相关问题