计算机网络/计算机科学与应用/系统/运维/开发

PHP 日期和时间处理技术

PHP 日期和时间


一、时区划分

整个地球分为24个时区,每个时区都有自己的本地时间

同一时间,每个时区的本地时间相差1~23个小时,

例如,英国伦敦本地时间与北京本地时间相差8个小时。


在国际无线电通信领域,使用一个统一的时间,称为通用协调时间(Universal Time Coordinated,UTC),UTC与格林尼治标准时间(Greenwich Mean Time,GMT)相同,都与英国伦敦的本地时间相同。


二、时区设置

PHP中的时区设置有以下两种方法:

1)修改php.ini文件中的设置,找到[date]下的

date.timezone =""选项,将其修改为“date.timezone=Asia/Hong_Kong”

然后重新启动Apache服务器


2)在应用程序中,在使用时间日期函数之前添加如下函数:

date_default_timezone_set(timezone);

参数timezone为PHP可识别的时区名称

PRC(中华人民共和国)、Asia/Chongqing(重庆)、Asia/Shanghai(上海)或者Asia/Urumqi(乌鲁木齐)等


注意:

如果将程序上传到空间中,那么对系统时区设置时,

不能修改php.ini文件,

只能使用date_default_timezone_set()函数对时区进行设置。


三、获得本地化时间戳

mktime()函数将一个时间转换成UNIX的时间戳值

mktime()函数根据给出的参数返回UNIX时间戳。

时间戳是一个长整数,包含了从UNIX纪元(1970年1月1日)到给定时间的秒数。

其参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。

语法:

int mktime(int hour,int minute,int second,int month,int day,int year,int [is_dst])

hour 小时数

minute 分钟数

second 秒数 

month 月份数

day 天数

year 年份数

is_dst 可以被设置为1 如果不是则设置为0 如果不确定是否为夏令时则设置为-1(默认值)


// 输出指定时间的时间戳  指定时间的时间戳:1355113436
echo "指定时间的时间戳:".mktime(12,23,56,12,10,2012)."<p>";

// 使用date()函数输出格式化后的日期 指定日期为:2012-12-10
echo "指定日期为:".date("Y-m-d",mktime(12,23,56,12,10,2012))."<p>";

// 使用date()函数输出格式化后的时间   指定时间为:12:23:56
echo "指定时间为:".date("H:i:s",mktime(12,23,56,12,10,2012));


四、获取当前时间戳

通过time()函数获取当前的Unix时间戳,返回值是从时间戳纪元(格林尼治时间1970年1月1日00:00:00)到当前的秒数。

time()

time()函数没有参数,返回值为Unix时间戳的整数值

// 获取当前时间戳
$time = time();
echo $time."<br/>"; //1638088954

// 使用date函数输出格式化后的当前时间
echo date("Y-m-d",$time); //2021-11-28


五、获取当前日期和时间

date()函数获取当前的日期和时间

date(format,timestamp)

format参数规定输出的日期时间格式,格式见链接

timestamp参数规定时间戳,默认是当前日期时间

// 使用date函数获取当前的时间和日期
echo date("Y-m-d h:i:s"); //2021-11-28 03:46:40
echo "<br/>";

// 使用date函数获取指定时间戳的日期和时间
echo date("Y-m-d h:i:s","1638088954"); //2021-11-28 03:42:34


六、获取日期信息

在日期数据处理中,有时会需要获取今天是一年中的第几天、今天是星期几等问题

可以使用getdate()函数获取日期指定部分的相关信息

getdate(timestamp)

返回的是一个关于日期时间的数组,如果没有timestamp参数,返回的是当前日期时间的信息。


getdate()函数返回的数组元素:

  • [seconds] - 秒

  • [minutes] - 分

  • [hours] - 小时

  • [mday] - 一个月中的第几天

  • [wday] - 一周中的某天

  • [mon] - 月

  • [year] - 年

  • [yday] - 一年中的某天

  • [weekday] - 星期几的名称

  • [month] - 月份的名称

  • [0] - 自 Unix 纪元以来经过的秒数

// 预格式化数组
echo "<pre>";
// 输出当前日期时间的信息
print_r(getdate());
/*
Array
(
    [seconds] => 53
    [minutes] => 51
    [hours] => 3
    [mday] => 28
    [wday] => 0
    [mon] => 11
    [year] => 2021
    [yday] => 331
    [weekday] => Sunday
    [month] => November
    [0] => 1638089513
)
*/


七、检验日期的有效性checkdate()函数

checkdate(month,day,year);

month参数用来检测月份是否符合规范,有效值为1~12;

day参数用来检测月份的天数是否符合规范,有效值为1~31天,2月为29天(闰年);

year参数用来检测年份,有效值为1~32767

// false
var_dump(checkdate(8, 31, -2000));


八、输出格式化的日期和时间

格式化日期和时间主要是format参数起作用

Y4位数字年,y为2位数字,如99即1999年
m数字月份,前面有前导0,如01。n 为无前导0数字月份
F月份,完整的文本格式,例如 January 或者 March
M三个字母缩写表示的月份,例如 Jan 或者 Mar
d月份中的第几天,前面有前导0,如03。j 为无前导0的天数
w星期中的第几天,以数字表示,0表示星期天
z年份中的第几天,范围0-366
W年份中的第几周,如第32周
H24小时格式,有前导0,h为12小时格式
G24小时格式,无前导0,g为对应12小时格式
i分钟格式,有前导0
s秒格式,有前导0
A大写上下午,如AM,a为小写


//2021-11-28 Sun 03:58:14
echo date("Y-m-d D h:i:s"); 
echo "<br/>";

//今天是一年中的第331天
echo "今天是一年中的第".date("z")."天";  
echo "<br/>";

//今天是一年中的第47个星期
echo "今天是一年中的第".date("W")."个星期";


九、显示本地化的日期和时间

使用setlocale()函数和strftime()函数来设置本地化环境和格式化输出日期和时间

改变PHP中默认的本地化环境

setlocale(category,locale)

category 参数

  • LC_ALL - 包括下面的所有选项

  • LC_COLLATE - 排序次序

  • LC_CTYPE - 字符类别及转换(例如所有字符大写或小写)

  • LC_MESSAGES - 系统消息格式

  • LC_MONETARY - 货币格式

  • LC_NUMERIC - 数字格式

  • LC_TIME - 日期和时间格式


locale参数:

必需。规定把地区信息设置为哪个国家/地区。可以是字符串或者数组。可以传递多个位置。

如果 location 参数是 NULL 或空字符串 "",则位置名称会被设置为上面常量中同名的环境变量的值或者根据 "LANG" 进行设置。

如果 location 参数是 "0",则位置设置不受影响,只返回当前的设置。

如果 location 参数是数组,setlocale() 会尝试每个数组元素,直到找到合法的语言或地区代码为止。如果某个地区在不同的系统上拥有不同的名称,这一点很有用。


//Chinese (Simplified)_China.936
echo setlocale(LC_ALL,NULL);

参考:https://www.w3school.com.cn/php/func_string_setlocale.asp


strftime()函数

strftime()函数根据本地化环境来格式化日期和时间

strftime(format,timestamp)

该函数返回给定的字符串对参数timestamp进行格式化后输出的字符串。

如果没用给出参数timestamp,则用本地时间。

月份、星期以及其他和语言有关的字符串写法和setlocale函数设置的当前区域有关。

// 星期日表示0
echo "今天是星期".strftime("%w");

参考:https://www.w3school.com.cn/php/func_date_strftime.asp


十、将日期和时间解析为Unix时间戳

使用strtotime()函数可以将任何英文文本的日期或时间描述解析为Unix时间戳。

strtotime(time,now);

参数:

time  必选,规定日期和时间字符串

now 可选 规定用来计算返回值的时间戳,如果省略该参数,则使用当前时间

echo "当前时间的时间戳".strtotime("now")."<br>";
echo "当前的时间".date("Y-m-d H:i:s",strtotime("now"))."<br>";
echo "输出下周此时此刻的时间戳:".strtotime("+1 week")."<br>";
echo "输出下周此时此刻的时间:".date("Y-m-d H:i:s",strtotime("+1 week"))."<br>";
/*
当前时间的时间戳1638090762
当前的时间2021-11-28 04:12:42
输出下周此时此刻的时间戳:1638695562
输出下周此时此刻的时间:2021-12-05 04:12:42
*/


十一、比较两个时间的大小

开发中经常会用到比较两个时间大小的问题,但是PHP中的时间是不可以直接进行比较的。

首先需要把时间转换为时间戳的格式,然后再进行比较

strtotime()函数可以完成时间戳的转换。

$T1 = "2020-11-25 5:10:50";
echo $T1."<br/>";

$T2 = date("Y-m-d h:i:s");
echo $T2."<br/>";

$time = strtotime($T1) - strtotime($T2);
if($time>0){
    echo "\$T1的时间大于\$T2的时间";
}else{
    echo "\$T1的时间小于\$T2的时间";
}

/*
2020-11-25 5:10:50
2021-11-28 04:22:28
$T1的时间小于$T2的时间
*/


十二、实现倒计时功能

$T3 = "2030-01-01 00:00:00";
echo "倒计时开始的时间\$T3".$T3."<br>";

$T4 = "2030-06-07 00:00:00";
echo "倒计时结束的时间\$T4".$T4."<br/>";

$t = strtotime($T4) - strtotime($T3);
echo "<br/>";

$day = ceil(($t/60/60/24)); // 天数
$hour = ceil(($t/60/60%24)); // 小时
$minute = ceil(($t/60/60%60)); // 分钟
$second = ceil(($t%60)); //秒数

echo "\$T3距离\$T4的倒计时还有:".$day."天".$hour."小时".$minute."分钟".$second."秒";


十三、计算页面脚本的运行时间

microtime(get_as_float) 返回当前Unix时间戳和微秒数




PHP 实现时间戳转化为几分钟前、几小时前等格式

https://blog.csdn.net/weixin_30438813/article/details/96969131


php 日期和时间

所有的努力,不是为了让别人觉得你了不起,而是为了能让自己打心眼里看得起自己。

评论

^