• 微信号
目录

php基础

您当前的位置:首页 > 我的笔记 > php基础>php日期和时间

php日期和时间

UNIX时间戳

在编程的时候,总会有一些不统一的地方无法满足编程环境的严格限制。例如,处理日期和时间的时候,推算起来会比较复杂,除了时间进制位外,还涉及到不同月份的天数可能不同,所以使用简单的运算是无法解决的。PHP提供了UNIX时间戳,用于解决时间的运算问题。

UNIX时间戳(UNIX timestamp)是一种时间的表达方式,以32位二进制数来表示。UNIX时间不仅被使用在UNIX系统中,在许多的操作系统也被广泛使用,由于时间戳不能为负数,因此1970年以前的时间戳无法使用。

将日期和时间转化为时间戳使得php中的日期和时间计算变得简单,php提供了mktime()函数用于返回一个指定时间的时间戳,其声明格式如下

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

该函数返回一个UNIX时间戳,参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。需要注意的是参数$is_dst,它用于指定是否为夏时制时间,1表示是,0表示不是,默认为-1,表示不知道是否是夏时制。这种情况下,php会自己尝试搞明白。可能会产生不可预知(但并非不正确)的结果。所以php5.1起版本参数已经废弃。

案例:演示mktime()函数用法

<?php
	echo date("Y-m-d H:i:s",mktime())."<br>"; //忽略所有参数,则使用当前时间
	echo date("Y-m-d H:i:s",mktime(15))."<br>";//指定小时,其他值使用当前时间
	echo date("Y-m-d H:i:s",mktime(15,28))."<br>"; //指定小时和分,其他时间使用当前时间
	echo date("Y-m-d H:i:s",mktime(16,30,56))."<br>";//指定时分秒,其他值使用当前时间
	echo date("Y-m-d H:i:s",mktime(18,30,55,3))."<br>"; //指定时分秒和月份,其他值使用当前时间
	echo date("Y-m-d H:i:s",mktime(8,32,35,2,16))."<br>";//指定时分秒,日期和月份,其他值使用当前时间
	echo date("Y-m-d H:i:s",mktime(10,31,52,11,30,2020))."<br>"; //指定时分秒,月日年
	echo "<hr>";
	echo "2021年4月20日14时15分46秒的时间戳为:".mktime(14,15,46,4,20,2021); 
?>

运行结果

陵小宇博客php日期和时间管理-unix时间戳-mktime函数

需要注意的是,由于时间戳是一个整数,如,1618899346(2021-4-20 14:15:46)根本看不懂它所表示的时间,所以在案例中使用了date()函数用于格式化输出。

获取时间

在实际开发中,经常需要获取时间,如系统时间、获取用户提交时间、获取程序执行时间等。

1. 获取系统时间

获取当前时间最简单的方法是使用time()函数,其声明格式如下:

time()函数没有参数,返回值为int类型。

php默认时区设置UTC(Universal Time Coordinated,全球标准时间)时间,与英国伦敦本地时间相同,而北京正好是东八区,所以使用time获取当前时间会出现8小时的时差。

要正确显示北京时间,通常有两种修改方式:

(1) 修改php配置文件,需要有服务器支配权限,修改php.ini文件中的data.timezone配置。例如,将默认的时区设置为PRC(中华人民共和国 );修改完成后重启服务器。

(2) 在程序中使用函数设置,可以在程序中使用date_default_timezone_set()函数来设置时区,改函数声明如下

bool date_default_timezone_set(string $timezone_identifier)

返回值类型为bool类型,timezone_identifier用于指定时区标识符,可以是“PRC”“Asia/shanghai”等,例如将默认时区设置为上海

<?php
	date_default_timezone_set("Asia/shanghai");
	echo date("Y-m-d H:i:s",time());
	bool date_default_timezone_set(string $timezone_identifier)
?>
2.获取用户提交的时间

在实际开发中,除了要求获取系统时间,也需要获取用户提交表单的时间,表单中的时间通常使用日期选择控件获得的字符串。如“2022-2-22 14:30:25”在php中提供了一个strtotime()函数,用于将字符串转化为时间戳。该函数声明格式如下

int strtotime(string $time[,int $now])

参数$time用于指定日期时间字符创,$now用于计算相对时间的参考点,如果省略则使用系统当前时间。

案例

<?php
	echo "2022-2-22 14:30:25时间戳为:".strtotime("2022-2-22 14:30:25")."<br>";//字符串转成时间戳,
	echo date("Y-m-d H:i:s",strtotime("2022-2-22 14:30:25"))."<br>";//将字符串转成时间戳然后格式化输出
	//输出明天的这个时间点点
	echo date("Y-m-d H:i:s",strtotime("+1 day"))."<br>";
	//输出3个月之前的时间点
	echo date("Y-m-d H:i:s",strtotime("-3 month"))."<br>";
	//输出下个星期一的日期时间
	echo date("Y-m-d H:i:s",strtotime("next monday"));
?>

运行结果

陵小宇博客php日期和时间管理-unix时间戳-mktime函数 3. 获取精确时间

UNIX时间戳是以秒作为最小计量单位,使用time()函数能处理php开发中的大部分应用,但对于某些程序来说不够精确。如计算脚本的执行时间。

Php提供了一个函数mincrtime()函数用于处理更精确的时间,其声明格式如下

mixed microtime([bool $get_as_flaota])

该函数返回UNIX时间戳以及微秒,参数$get_as_float是可选参数,如果设置为true将返回一个浮点数,如果省略,则以msec sec格式返回一个字符串,其中msec是微秒部分,sec是秒数,但是都是以秒为单位返回。

案例

<?php
	header("Content-Type:text/html;charset=utf-8");
	//定义一个函数获取脚本运行时间
	function microtime_float(){
		list($usec,$sec)=explode(" ",microtime());
		return ((float)$usec+(float)$sec);
	}
	$time_start=microtime_float();
	usleep(1000);
	$time_end=microtime_float();
	$time=$time_end-$time_start;
	echo "脚本执行花费了".$time."秒";
?>

运行结果

陵小宇博客php日期和时间管理-unix时间戳-mktime函数

定义一个获取精准时间的函数,在脚本开始的时候调用该函数获取开始执行时间,在脚本结束的时候,调用该函数获取脚本运行结束时间,二者相减,计算出脚本运行的时间。

格式化输出

使用UNIX时间戳保存和计算时间很方便,但是时间戳的可读性很差,乍一看就是一个毫无意义的整形数值,所以需要对时间戳进行格式化处理,然后在输出。其声明格式如下

string date(string $format[, int $timestamp])

返回值类型是string类型。$timestamp为可选参数,如果没有指定则是当前时间。$format为固定参数,表示给定的格式。在格式化时间时,有许多代表特殊意义的$format字符。常见的格式如下

format字符 说明 示例
d 月份中的第几天,有前导零的2位数 01到31
D 星期中的第几天,文本表示,3个字母 Mon到Sun
j 月份中的第几天,没有前导0 1到31
l 星期几,完整的文本格式 Sunday到Saturday
N ISO-8601格式数字便是星期中的第几天 1(星期一)到7(星期天)
S 每月数天后面的英文后缀,2个字符 st,nd,rd或者th
w 星期中的第几天,数字表示 0(星期天)到6(星期六)
z 年份中的第几天 0到365
W ISO-8601格式年份中的第几周(每周从周一开始) 如,42(当年的42周)
F 月份,完整文本格式,如,january,March January到December
m 数字表示月份,有前导零 01到12
M 三个字母缩写表示的月份 Jan到Dec
n 数字表示的月份,没有前导零 1到12
t 给定月份应有的天数 28到31
L 是否为闰年 如果是为1否则为0
o ISO-8601格式年份数字 如,199or2009
Y 4位数字完整表示的年份 如,1997或2010
y 2位数字表示的年份 如,98或08
a 小写的上午和下午值 am或pm
A 大写的上午和下午值 AM或PM
B Swatch Internet标准时 000到999
g 小时,12小时格式,没有前导零 1到12
G 小时,24小时格式,没有前导零 1到24
h 小时,12小时格式,有前导零 01到12
H 小时,24小时格式,有前导零 00到23
i 有前导零的分钟数 00到59
s 秒数,有前导零 00到59

案例

<?php
	echo date("Y年m月d日H时i分s秒",time())."<br>";
	echo "今天是".date("l",time())."<br>";
	echo date('l ds \of F Y H:i:s A');
?>

运行结果

陵小宇博客php日期和时间管理-unix时间戳-mktime函数

date()函数将当前时间格式化输出。需要注意的是,在格式化非format字符前需要加上反斜杆来转义,否则它会按照format字符进行解释