PHP面试知识复习(五):系统内置函数——DateTime类相关

DateTime类相关

PHP提供了一系列内置的时间日期函数,可以用来

  • 获取服务器的日期和时间
  • 将这些日期时间格式化成不同的字符串
  • 也可以对这些日期时间进行计算

date()time()等内置函数相比,DateTime相关类更加直观、方便,PHP5.2之后可用,推荐使用

DateTime

DateTime::__construct

(PHP >= PHP5.2, PHP7)

返回一个新的DateTime对象

1
2
3
4
5
6
7
<?php
// 面向对象风格
public DateTime::__construct([string $time = 'now'[, DateTimeZone $timezone = NULL]])

// 面向过程风格
DateTime date_create([string $time = 'now'[, DateTimeZone $timezone = NULL]])
?>

如果发生错误,会抛出Exception

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
// 面向对象风格
try {
$date = new DateTime('2000-01-01');
} catch (Exception $e) {
echo $e->getMessage();
exit(1);
}

echo $date->format('Y-m-d'); // 2000-01-11

// 面向过程风格
$date = date_create('2000-01-01');
if (!$date) {
$e = date_get_last_errors();
foreach ($e['errors'] as $error) {
echo "$error\n";
}
}

echo date_format($date, 'Y-m-d'); // 2000-01-11
?>

DateTime::createFromFormat

(PHP >= PHP5.3, PHP7)

根据给定的格式解析日期时间字符串

1
2
3
4
5
6
7
<?php
// 面向对象风格
public static DateTime::createFromFormat(string $format, string $time[, DateTimeZone $timezone])

// 面向过程风格
DateTime date_create_from_format(string $format, string $time[, DateTimeZone $timezone])
?>

返回一个 DateTime 对象。 或者在失败时返回 FALSE

format中支持的字符,查看PHP: DateTime::createFromFormat - Manual

1
2
3
4
5
6
7
8
9
<?php
// 面向对象风格
$date = DateTime::createfromformat('j-M-Y', '15-Feb-2009');
echo $date->format('Y-m-d'); // 2009-02-15

// 面向过程风格
$date = date_create_from_format('j-M-Y', '15-Feb-2009');
echo date_format($date, 'Y-m-d'); // 2009-02-15
?>

DateTime::setDate

(PHP >= PHP5.2, PHP7)

设置DateTime对象的日期

1
2
3
4
5
6
7
<?php
// 面向对象风格
public DateTime DateTime::setDate(int $year, int $month, int $day)

// 面向过程风格
DateTime date_date_set(DateTime $object, int $year, int $month, int $day)
?>

返回被修改的 DateTime 对象, 或者在失败时返回FALSE

1
2
3
4
5
6
7
8
9
10
11
<?php
// 面向对象风格
$date = new DateTime();
$date->setDate(2001, 2, 3);
echo $date->format('Y-m-d'); // 2001-02-03

// 面向过程风格
$date = date_create();
date_date_set($date, 2001, 2, 3);
echo date_format($date, 'Y-m-d'); // 2001-02-03
?>

DateTime::setTime

(PHP >= PHP5.2, PHP7)

设置DateTime对象的时间

1
2
3
4
5
6
7
<?php
// 面向对象风格
public DateTime::setTime(int $hour, int $minute[, int $second = 0[, int $microsecond = 0]])

// 面向过程风格
DateTime date_time_set(DateTime $object, int $hour, int $minute[, int $second = 0[, int $microsecond = 0]])
?>

返回被修改的 DateTime 对象, 或者在失败时返回 FALSE

1
2
3
4
5
6
7
8
9
10
11
<?php
// 面向对象风格
$date = new DateTime('2001-01-01');
$date->setTime(14, 55, 24);
echo $date->format('Y-m-d H:i:s'); // 2001-01-01 14:55:24

// 面向过程风格
$date = date_create('2001-01-01');
date_time_set($date, 14, 55, 24);
echo date_format('Y-m-d H:i:s'); // 2001-01-01 14:55:24
?>

DateTime::setTimeStamp

(PHP >= PHP5.3, PHP7)

以UNIX时间戳的方式设置DateTime对象

1
2
3
4
5
6
7
<?php
// 面向对象风格
pubilc DateTime DateTime::setTimeStamp(int $unixtimestamp)

// 面向过程风格
DateTime date_timestamp_set(DateTime $object, int $unixtimestamp)
?>

返回被修改的 DateTime 对象, 或者在失败时返回 FALSE

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// 面向对象风格
$date = new DateTime('2010-04-28 22:41:43');
echo $date->format('U = Y-m-d H:i:s'); // 1272508903 = 2010-04-28 22:41:43
$date->setTimeStamp(1171502725);
echo $date->format('U = Y-m-d H:i:s'); // 1171502725 = 2007-02-14 20:25:25

// 面向过程风格
$date = date_create('2010-04-28 22:41:43');
echo date_format($date, 'U = Y-m-d H:i:s'); // 1272508903 = 2010-04-28 22:41:43
date_timestamp_set($date, 1171502725);
echo date_format($date, 'U = Y-m-d H:i:s'); // 1171502725 = 2007-02-14 20:25:25
?>

DateTime::modify

(PHP >= PHP5.2, PHP7)

修改日期时间对象的值

1
2
3
4
5
6
7
<?php
// 面向对象风格
public DateTime DateTime::modify(string $modify)

// 面向过程风格
DateTime date_modify(DateTime $object, string $modify)
?>

支持strtotime()函数所允许的字符串

1
2
3
4
5
6
7
8
9
10
11
<?php
// 面向对象风格
$date = new DateTime('2006-12-12');
$date->modify('+1 day');
echo $date->format('Y-m-d'); // 2006-12-13

// 面向过程风格
$date = date_modify('2000-01-20');
date_modify($date, '+1 day');
echo date_format($date, 'Y-m-d'); // 2006-12-13
?>

DateTime::add

(PHP >= PHP5.3, PHP7)
(PHP5.2可用DateTime::modify代替)

给一个DateTime对象增加一定量的天,月,年,小时,分钟以及秒

1
2
3
4
5
6
7
<?php
// 面向对象风格
public DateTime DateTime::add(DateInterval $interval)

// 面向过程风格
DateTime date_add(DateTime $object, DateInterval $interval)
?>
  • 将给定的DateInterval对象加到DateTime对象上
  • 返回修改后的DateTime 对象,失败返回FALSE
1
2
3
4
5
6
7
8
9
10
11
<?php
// 面向对象风格
$date = new DateTime('2000-01-01');
$date->add(new DateInterval('P10D'));
echo $date->format('Y-m-d') . "\n"; // 2000-01-11

// 面向过程风格
$date = date_create('2000-01-01');
date_add($date, date_interval_create_from_date_string('10 days'));
echo date_format($date, 'Y-m-d'); // 2000-01-11
?>

DateTime::sub

(PHP >= PHP5.3, PHP7)
(PHP5.2可用DateTime::modify代替)

给一个DateTime对象减去一定量的天,月,年,小时,分钟以及秒

1
2
3
4
5
6
7
<?php
// 面向对象风格
public DateTime DateTime::sub(DateInterval $interval)

// 面向过程风格
DateTime date_sub(DateTime $object, DateInterval $interval)
?>
  • DateInterval对象,表示要减去多少时间
  • 返回修改后的DateTime 对象,失败返回FALSE
1
2
3
4
5
6
7
8
9
10
11
<?php
// 面向对象风格
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('P10D'));
echo $date->format('Y-m-d') . "\n"; // 2000-01-10

// 面向过程风格
$date = date_create('2000-01-20');
date_sub($date, date_interval_create_from_date_string('10 days'));
echo date_format($date, 'Y-m-d'); // 2000-01-10
?>

DateTime::getLastErrors

(PHP >= PHP5.3, PHP7)

获取警告和错误信息

1
2
3
4
5
6
7
<?php
// 面向对象风格
public static array DateTime::getLastErrors(void)

// 面向过程风格
array date_get_last_errors(void)
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// 面向对象风格
try {
$date = new DateTime('asdfasdf');
} catch (Exception $e) {
// 仅出于演示的目的...
print_r(DateTime::getLastErrors());

// 实际的代码中你应该这样使用返回对象
// echo $e->getMessage();
}

// 面向过程风格
$date = date_create('asdfasdf');
print_r(date_get_last_errors());
?>

错误信息为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Array
(
[warning_count] => 1
[warnings] => Array
(
[6] => Double timezone specification
)

[error_count] => 1
[errors] => Array
(
[0] => The timezone could not be found in the database
)

)

参考