Date/Time 函数
在线手册:中文  英文

date_create

(PHP 5 >= 5.2.0)

date_create别名 DateTime::__construct()

说明

此函数是该函数的别名: DateTime::__construct()


Date/Time 函数
在线手册:中文  英文

用户评论:

Marton Bodonyi (2013-02-02 04:34:56)

If you are getting an error like this:
Exception: DateTime::__construct(): Failed to parse time string (13/02/2013) at position 0 (1): Unexpected character in DateTime->__construct()
Note that when you create a new date object using a format with slashes and dashes (eg 02-02-2012 or 02/02/2012) it must be in the mm/dd/yy(yy) or mm-dd-yy(yy) format (rather than british format dd/mm/yy)! Months always before years (the american style) otherwise you'll get an incorrect date and may get an error like the one above (where PHP is crashing on trying to decode a 13th month).
Can catch you off guard because everything seems to be working fine and dandy until you hit a value over 12.

php at andysdrawings dot co dot uk (2012-05-16 15:21:59)

DateTime will recognise any number up to 12 as a [month], and any number up to 31 as a [day]; it calculates the resulting date to be [day] days after the start of [month].  This means that when a datetime object is created with more days than are found in that month, the date will be beyond the end of the month.

<?php
  $test 
= new DateTime('02/31/2011');
  echo 
date_format($test'Y-m-d H:i:s'); // 2011-03-03 00:00:00
  
$test = new DateTime('06/31/2011');
  echo 
date_format($test'Y-m-d H:i:s'); // 2011-07-01 00:00:00
?>

me at jameswdunne dot com (2011-07-17 04:12:10)

You should also be aware that DateTime has very lax date validation rules. It appears that all months have a maximum of 31 days.

For example, these will work fine:

<?php
  $test 
= new DateTime('02/31/2011');
  
$test = new DateTime('06/31/2011');
?>

We all know that these dates are not real and are invalid so I think a good idea is to do some further validation on dates before creating a DateTime object with them.

Keith Humm (2008-11-26 16:12:06)

An interesting note that came from the tutorial (as well as my own testing) is that the DateTime constructor is exception happy. In other languages this is a bit of a no-no - throwing exceptions from within a constructor can cause all sorts of odd problems!

Either way, because of this you should attempt to catch any exception and only use the object if it does not throw an exception.

<?php

$bad_date_string 
'ublingah!';
try {
    
$dt = new DateTime($bad_date_string);
}
catch(
Exception $e) {
    
// catches 'Failed to parse time string (ublingah!) at position 0 (u)' exception.
    // don't use this object
}
?>

djspillers at mac dot com (2008-08-19 12:29:01)

Looks like the DateTime class does not exist in my PHP 5.1.5 installation. The only documentation I can find says this class shows up in PHP 5.2

prikkeldraad at gmail dot com (2008-02-19 05:56:26)

Serialization and unserialization fail for the DateTime object (PHP 5.2.5).

With your own __sleep and __wakeup function in a child class you can work around this problem.

<?php
class MyDateTime extends DateTime {
    private 
$_str;
    
    public function 
__sleep(){
        
$this->_str $this->format('c');
        return array(
'_str');
    }
    
    public function 
__wakeup() {
        
$this->__construct($this->_str);
    }
}
?>

Regards, Mick

[Ed. Please be aware that this is *not* 100% correct as you lose the timezone information. Always use the standard serialization if it's available!]

mroximoron (2007-12-11 07:15:09)

The string format here is a bit wrong, yes it accepts the same format, but not the same range as strtotime.
strtotime can't handle dates like 2100-01-01 while this one can..

jsnell at e-normous dot com (2007-10-28 15:22:11)

When using these functions inside of destructors or functions called as a result of being registered with register_shutdown_handler, be sure to use date_create() instead of new DateTime(). This is because new DateTime will throw an exception on failure, which is not permitted in any of the above circumstances. If new DateTime() does fail in one of these circumstances, you will get an error stating "Fatal error: Exception thrown without a stack frame in Unknown on line 0."

karsten at typo3 dot org (2007-09-17 09:03:46)

The manual says "Returns DateTime object on success or FALSE on failure".
I tried hard to provoke a failure, but I seem to always get a DateTime object back, even though the PHP log says things like: "Failed to parse time string (2007W992-11:16:47+00:00) at position 5 (9): Unexpected character"
So if you (need to) check the result, beware!
[red. in PHP 5.3 and higher, you can do that with DateTime::getLastErrors().]

Dok (2007-07-05 07:52:15)

If you want to create the DateTime object directly from a timestamp use this

<?php
$st 
1170288000 //  a timestamp
$dt = new DateTime("@$st");
?>

See also: http://bugs.php.net/bug.php?id=40171

artur at jedlinski dot pl (2007-04-19 05:47:22)

"String in a format accepted by strtotime()" is not 100% truth - you cannot pass timezone info in the string used as DateTime constructor, while you can do it with strtotime(). It may be a problem if you would like to create a date from GMT time and then display it in your local timezone, for example:

<?php
    $timeZone 
'Europe/Warsaw';  // +2 hours
    
date_default_timezone_set($timeZone);
    
    
$dateSrc '2007-04-19 12:50 GMT';
    
$dateTime = new DateTime($dateSrc);
    
    echo 
'date(): '.date('H:i:s'strtotime($dateSrc));
    
// correct! date(): 14:50:00
    
    
echo 'DateTime::format(): '.$dateTime->format('H:i:s');
    
// INCORRECT! DateTime::format(): 12:50:00
?>

[red. your claim that "is not 100% truth" is incorrect, you're seeing desired behavior here. The timezone passed as 2nd argument is used as a default fall back, in case the parsed string doesn't provide TZ information.]

So if you want to convert date between different timezones, you have to create two DateTimeZone objects - one for the input and one for output, like this:

<?php
    $timeZone 
'Europe/Warsaw';  // +2 hours
    
$dateSrc '2007-04-19 12:50';
    
    
$dateTime = new DateTime($dateSrc, new DateTimeZone('GMT'));
    
$dateTime->setTimeZone(new DateTimeZone($timeZone));
    echo 
'DateTime::format(): '.$dateTime->format('H:i:s');
    
// CORRECT! DateTime::format(): 14:50:00
?>

I'm not sure if this is a bug or desired behaviour.
[red. you don't have to do create two DateTimeZone objects, this works too:
<?php
    $timeZone 
'Europe/Warsaw';  // +2 hours
    
$dateSrc '2007-04-19 12:50 GMT';
    
    
$dateTime = new DateTime($dateSrc);
    
$dateTime->setTimeZone(new DateTimeZone($timeZone));
    echo 
'DateTime::format(): '.$dateTime->format('H:i:s');
    
// CORRECT! DateTime::format(): 14:50:00
?>
]

nizar dot jouini at gmail.com (2007-03-07 05:05:44)

date_create and other DateTime related functions are included by default only in PHP versions equal and greater than 5.2.
In PHP 5.1.2 this functionality is marked to be experimental and has to be enabled at compile time.

易百教程