PHP日期与时间应用与实践

时间与日期是日常生活中重要的参照物,相应的程序员必须经常与网站的各种时间打交道,比如什么时候访问量是最高的?某段时间注册的用户是哪些?
本文主要介绍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月中的日期,有前导001-31
D表示星期的三字母文本Mon-Sun
E时区标识America/New_York
F月份完整表示January-December
g12小时格式,没前导01-12
G24小时格式,没前导00-23
h12小时格式,前导001-12
H24小时格式,前导000-23
i分钟,前导001-60
I夏令时否0,是1
j月中日期,没前导01-31
l日期的文本表示Monday-Sunday
L闰年否0,是1
m月份的表示数值,有前导001-12
M月份的三字母表示Jan-Dec
n月份的数值表示,没前导01-12
o与格林尼治标准时间之差-0500
r根据RFC2822格式化时间Tue,19 Apr 2010 22:37:00 -0500
s秒,前导000-59
S日的序数后缀st、nd、rd、th
t月的天数28-31
T时区PRC
UUNIX纪元以来的秒数123123
w星期几的数值表示0周日,6周六
W一年中的星期号1-52或53
Y年的4位表示1901-2038
z年的某一天0-364
Z时区偏移-43200-50400
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值