时间与日期是日常生活中重要的参照物,相应的程序员必须经常与网站的各种时间打交道,比如什么时候访问量是最高的?某段时间注册的用户是哪些?
本文主要介绍PHP中的强大时间处理功能,以及多种处理方式。
<?php
function v($d)
{
var_dump($d);
}
/**
* 日期是否有效
* checkdate(month(月), day(日), year(年))
*/
v(checkdate(4, 31, 2010)); // 0 没有
v(checkdate(4, 30, 2010)); // 1 有
v(checkdate(2, 29, 2012)); // 1 有,是闰年
v(checkdate(2, 29, 2011)); // 0 没有,不是闰年
/**
* 日期是否有效
* checkdate(format(参数格式), [timestamp(时间戳)])
* 函数格式参数参照注1
*/
v("Today is " . date("F d, Y")); // Today is August 31, 2019
v("Today is " . date("l")); // Today is Saturday
// 无关字符结果不可预知
v(date("Today is l the ds day of F Y")); // UTC201931am19 3203 Saturday 3108UTC 3103 31am19 2019f August 2019
// 常用
v(date("Y-m-d H:i:s", time())); // 2019-08-31 08:34:27
/**
* 返回时间数组
* gettimeofday([return_float(是否返回浮点型时间戳)])
*/
v(gettimeofday(1));
/*
1:1567241095.5499
0(默认):Array
(
[sec] => 1567241127
[usec] => 763923
[minuteswest] => -480
[dsttime] => 0
)
*/
printf("Server location is %d hours west of PRC.", gettimeofday()['minuteswest'] / 60);
// Server location is -8 hours west of PRC.
/**
* 返回相关时间数组
* getdate([timestamp(时间戳)])
*/
v(getdate());
/*
Array
(
[seconds] => 24
[minutes] => 54
[hours] => 16
[mday] => 31
[wday] => 6
[mon] => 8
[year] => 2019
[yday] => 242
[weekday] => Saturday
[month] => August
[0] => 1567241664
)
*/
/**
* 当前时间戳
* time()
*/
v(time()); // 1567241892
/**
* 特定时间戳
* mktime(hour, [minute, second, month, day, year])
*/
v(mktime(17, 05, 11, 8, 31, 2019)); // 1558683300
// 计算时间差2019.04.15距今差多少小时
$now = time();
$taxDeadline = mktime(0, 0, 0, 4, 15, 2019);
$difference = $now - $taxDeadline;
$hours = round($difference / 60 / 60);
echo "Only " . number_format($hours) . " hours until the tax deadline!";
// Only 3,329 hours until the tax deadline!
// 计算当前日期后X天的日期
$futuredate = strtotime("+45 days");
echo $futuredate; // 1571132005
echo date("F d, Y", $futuredate); // October 15, 2019
$futuredate = strtotime("-45 days");
echo date("F d, Y", $futuredate); // July 17, 2019
// 10周加俩天
$futuredate = strtotime("10 weeks 2 days");
echo date("F d, Y", $futuredate); // November 11, 2019
// Datetime函数
$date1 = new Datetime();
$date2 = new Datetime("25 May 2010");
$date3 = new Datetime("25 May 2010 21:55");
v($date2);
/*
object(DateTime)#2 (3) {
["date"]=>
string(26) "2010-05-25 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "PRC"
}
*/
// 格式化
echo $date2->format("Y-m-d H:i:sa"); // 2010-05-25 00:00:00am
// 实例化设置日期
$date = new Datetime();
$date->setDate(2019, 8, 31);
echo $date->format("F j, Y"); // August 31, 2019
// 实例化设置时间
$date = new Datetime();
$date->setTime(2019, 8, 31);
echo $date->format("H:i:s"); // 03:08:31
// 实例化修改时间
$date = new Datetime("August 31, 2019 17:00");
$date->modify("+27 days");
echo $date->format("Y-m-d h:i:s"); // 2019-09-27 05:00:00
// 计算时间差
$terminationDate = new Datetime("2019-08-22");
$todayDate = new Datetime("today");
$span = $terminationDate->diff($todayDate);
echo "Your subscription ends in {$span->format("%d")} days"; // Your subscription ends in 9 days
注1:格式参数列表
参数 | 描述 | 示例 |
---|---|---|
a | 小写上午下午 | am或pm |
A | 大写上午下午 | AM或PM |
d | 月中的日期,有前导0 | 01-31 |
D | 表示星期的三字母文本 | Mon-Sun |
E | 时区标识 | America/New_York |
F | 月份完整表示 | January-December |
g | 12小时格式,没前导0 | 1-12 |
G | 24小时格式,没前导0 | 0-23 |
h | 12小时格式,前导0 | 01-12 |
H | 24小时格式,前导0 | 00-23 |
i | 分钟,前导0 | 01-60 |
I | 夏令时 | 否0,是1 |
j | 月中日期,没前导0 | 1-31 |
l | 日期的文本表示 | Monday-Sunday |
L | 闰年 | 否0,是1 |
m | 月份的表示数值,有前导0 | 01-12 |
M | 月份的三字母表示 | Jan-Dec |
n | 月份的数值表示,没前导0 | 1-12 |
o | 与格林尼治标准时间之差 | -0500 |
r | 根据RFC2822格式化时间 | Tue,19 Apr 2010 22:37:00 -0500 |
s | 秒,前导0 | 00-59 |
S | 日的序数后缀 | st、nd、rd、th |
t | 月的天数 | 28-31 |
T | 时区 | PRC |
U | UNIX纪元以来的秒数 | 123123 |
w | 星期几的数值表示 | 0周日,6周六 |
W | 一年中的星期号 | 1-52或53 |
Y | 年的4位表示 | 1901-2038 |
z | 年的某一天 | 0-364 |
Z | 时区偏移 | -43200-50400 |