文字

DateTime::__construct

date_create

(PHP 5 >= 5.2.0, PHP 7)

DateTime::__construct -- date_createReturns new DateTime object

说明

面向对象风格

public DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )

过程化风格

DateTime date_create ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )

Returns new DateTime object.

参数

time

日期/时间字符串。正确格式的说明详见 日期与时间格式。

Enter NULL here to obtain the current time when using the $timezone parameter.

timezone

A DateTimeZone object representing the timezone of $time.

If $timezone is omitted, the current timezone will be used.

Note:

The $timezone parameter and the current timezone are ignored when the $time parameter either is a UNIX timestamp (e.g. @946684800) or specifies a timezone (e.g. 2010-01-28T15:00:00+02:00).

返回值

Returns a new DateTime instance. 过程化风格在失败时返回 FALSE

错误/异常

Emits Exception in case of an error.

更新日志

版本 说明
5.3.0 If time contains an invalid date/time format, then an exception is now thrown. Previously an error was emitted.

范例

Example #1 DateTime::__construct() example

面向对象风格

<?php
try {
    
$date  = new  DateTime ( '2000-01-01' );
} catch (
Exception $e ) {
    echo 
$e -> getMessage ();
    exit(
1 );
}

echo 
$date -> format ( 'Y-m-d' );
?>

过程化风格

<?php
$date 
date_create ( '2000-01-01' );
if (!
$date ) {
    
$e  date_get_last_errors ();
    foreach (
$e [ 'errors' ] as  $error ) {
        echo 
" $error \n" ;
    }
    exit(
1 );
}

echo 
date_format ( $date 'Y-m-d' );
?>

以上例程会输出:

2000-01-01

Example #2 Intricacies of DateTime::__construct()

<?php
// Specified date/time in your computer's time zone.
$date  = new  DateTime ( '2000-01-01' );
echo 
$date -> format ( 'Y-m-d H:i:sP' ) .  "\n" ;

// Specified date/time in the specified time zone.
$date  = new  DateTime ( '2000-01-01' , new  DateTimeZone ( 'Pacific/Nauru' ));
echo 
$date -> format ( 'Y-m-d H:i:sP' ) .  "\n" ;

// Current date/time in your computer's time zone.
$date  = new  DateTime ();
echo 
$date -> format ( 'Y-m-d H:i:sP' ) .  "\n" ;

// Current date/time in the specified time zone.
$date  = new  DateTime ( null , new  DateTimeZone ( 'Pacific/Nauru' ));
echo 
$date -> format ( 'Y-m-d H:i:sP' ) .  "\n" ;

// Using a UNIX timestamp.  Notice the result is in the UTC time zone.
$date  = new  DateTime ( '@946684800' );
echo 
$date -> format ( 'Y-m-d H:i:sP' ) .  "\n" ;

// Non-existent values roll over.
$date  = new  DateTime ( '2000-02-30' );
echo 
$date -> format ( 'Y-m-d H:i:sP' ) .  "\n" ;
?>

以上例程的输出类似于:

2000-01-01 00:00:00-05:00
2000-01-01 00:00:00+12:00
2010-04-24 10:24:16-04:00
2010-04-25 02:24:16+12:00
2000-01-01 00:00:00+00:00
2000-03-01 00:00:00-05:00

参见

  • DateTime::createFromFormat() - Returns new DateTime object formatted according to the specified format
  • DateTimeZone::__construct() - Creates new DateTimeZone object
  • Date and Time Formats
  • date.timezone ini setting
  • date_default_timezone_set() - 设定用于一个脚本中所有日期时间函数的默认时区
  • DateTime::getLastErrors() - Returns the warnings and errors
  • checkdate() - 验证一个格里高里日期

用户评论:

[#1] Rabenschwinge [2015-02-13 13:55:00]

Impossible times due to daylight savings are handled by this function in a way similar to impossible dates, with the difference that this is not an error (i.e. a consequent call to DateTime::getLastError() yields nothing).

For example:
In the timezone "Europe/Berlin" on Sunday, March 30 2014 there was no 02:30 am, because that our is being skipped due to daylight savings on that day.

<?php
$tz 
= new DateTimeZone("Europe/Berlin");
$impossible_time "2014-03-30T02:30:00";
$date = new DateTime($impossible_time$tz);
var_dump($date->getLastErrors());
echo 
"The impossible time '$impossible_time' is interpreted as: " $date->format(DateTime::ISO8601) . "\n";


?>


That is similar to how, for example, Febuary 29, 2014 would be handled, which would be interpreted as March 1, 2014. The difference is, that with the date that would be an error, with the time it is not.

Ambigous times due to daylight savings are handled as the second possibility. For example the time 2:30 am occurred twice on October 26, 2014 in the timezone "Europe/Berlin".

<?php
$tz 
= new DateTimeZone("Europe/Berlin");
$ambiguous_time "2014-10-26T02:30:00";
$date = new DateTime($ambiguous_time$tz);
echo 
"The ambiguous time '$ambiguous_time' is interpreted as: " $date->format(DateTime::ISO8601) . "\n";


?>


Note that "2014-10-26T02:30:00+0200", one hour earlier, would be a correct answer as well.

[#2] Wes Hyse [2015-01-29 20:58:47]

It is worth noting:

If you have not setup a default timezone, an Exception (or error if PHP < 5.3.0) will be thrown even when the $time parameter of the constructor includes a timezone or is a UNIX timestamp.

At least for me, this was unexpected considering that the $timezone parameter is ignored in the cases when "the $time parameter either is a UNIX timestamp (e.g. @946684800) or specifies a timezone (e.g. 2010-01-28T15:00:00+02:00)."

[#3] tzvi at somesite dot com [2015-01-09 11:38:32]

If time cannot be parsed an exception of type Exception is thrown which can be caught, however an E_WARNING is emitted as well. This might be confusing if you are converting warnings to exceptions in your error or shutdown handler.

<?php
try {
    
$var = new DateTime('some invalid date format');
}
catch (
Exception $ex) {}
$warning error_get_last(); // will contain warning info
?>

[#4] rn at alpha9marketing dot com [2014-11-25 12:47:58]

Note that the DateTime ctor also accepts boolean false and empty strings, and treats them the same as NULL (i.e. result is current date and time). This may lead to unexpected results if you forward function return values without explicitly checking them first.

Empty arrays and boolean true trigger PHP warnings OTOH.

(checked with PHP 5.5.18)

[#5] Dimitar Stoichev [2014-04-23 09:25:45]

Be careful working with MySQL dates representing point of transition to Daylight Saving Time.
The constructor of DateTime will convert timezone abbreviation to DST but not the time.

<?php

$timeZone 
= new DateTimeZone('Europe/Sofia');
            
$transitionToDst '2014-03-30 03:00:00';

$date = new DateTime($transitionToDst$timeZone);

// Outputs: Sun Mar 30, 2014 3:00:00 EEST
// Correct: Sun Mar 30, 2014 4:00:00 EEST 
echo $date->format('D M j, Y G:i:s T') . '<br>';

// Explicitly setting timezone or adding one second fixes this
$cloneForAdding = clone $date;

$date->setTimezone($timeZone);

// Outputs: Sun Mar 30, 2014 4:00:00 EEST 
echo $date->format('D M j, Y G:i:s T') . '<br>';

$cloneForAdding->add(new DateInterval('PT1S'));

// Outputs: Sun Mar 30, 2014 4:00:01 EEST
echo $cloneForAdding->format('D M j, Y G:i:s T');

?>

[#6] RussellG [2013-09-29 16:08:25]

Although this function throws an exception on invalid $time values (empty strings, for example), the exception can't be caught because it's a fatal exception. Use functions such as checkdate() and strtotime() to validate the string first. Example #1 should be changed to remove the try/catch block, since it's misleading.

[#7] cHao [2011-12-22 07:17:26]

There's a reason for ignoring the time zone when you pass a timestamp to __construct.  That is, UNIX timestamps are by definition based on UTC.  @1234567890 represents the same date/time regardless of time zone.  So there's no need for a time zone at all.

[#8] joel dot kallman at gmail dot com [2011-05-23 18:14:09]

A definite "gotcha" (while documented) that exists in the __construct is that it ignores your timezone if the $time is a timestamp.  While this may not make sense, the object does provide you with methods to work around it.

<?php
// New Timezone Object
$timezone = new DateTimeZone('America/New_York');

// New DateTime Object
$date =  new DateTime('@1306123200'$timezone);    

// You would expect the date to be 2011-05-23 00:00:00
// But it actually outputs 2011-05-23 04:00:00
echo $date->format('Y-m-d H:i:s');

// You can still set the timezone though like so...        
$date->setTimezone($timezone);

// This will now output 2011-05-23 00:00:00
echo $date->format('Y-m-d H:i:s');
?>

[#9] Tim Strehle [2010-05-05 03:50:14]

"The $timezone parameter and the current timezone are ignored when the $time parameter [??] is a UNIX timestamp."

Watch out ?C this means that these two are NOT equivalent, they result in different timezones (unless your current timezone is GMT):

<?php
$d 
= new DateTime(); $d->setTimestamp($t);
echo 
$o->format('O');
// +0200

$d = new DateTime('@' $t);
echo 
$o->format('O');
// +0000
?>

[#10] kendsnyder at gmail dot com [2010-01-12 08:37:05]

Also forgot to mention, that MySQL "zeroed" dates do not throw an error but produce a non-sensical date:

<?php

$d 
= new DateTime("0000-00-00");
$d->format("Y-m-d"); // "-0001-11-30"

?>


Another good reason to write your own class that extends from DateTime.

[#11] kendsnyder at gmail dot com [2010-01-12 08:24:35]

The theoretical limits of the date range seem to be "-9999-01-01" through "9999-12-31" (PHP 5.2.9 on Windows Vista 64):

<?php

$d 
= new DateTime("9999-12-31"); 
$d->format("Y-m-d"); // "9999-12-31"

$d = new DateTime("0000-12-31"); 
$d->format("Y-m-d"); // "0000-12-31"

$d = new DateTime("-9999-12-31"); 
$d->format("Y-m-d"); // "-9999-12-31"

?>


Dates above 10000 and below -10000 do not throw errors but produce weird results:

<?php

$d 
= new DateTime("10019-01-01"); 
$d->format("Y-m-d"); // "2009-01-01"

$d = new DateTime("10009-01-01"); 
$d->format("Y-m-d"); // "2009-01-01"

$d = new DateTime("-10019-01-01"); 
$d->format("Y-m-d"); // "2009-01-01"

?>

上一篇: 下一篇: