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参数起作用
Y | 4位数字年,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周 |
H | 24小时格式,有前导0,h为12小时格式 |
G | 24小时格式,无前导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