您的位置 首页 php

PHP入门读书笔记(十五):日期和时间

一、从获取当前时间说起

看一段代码:

 <?php
$date = date("Y-m-d H:i:s");
echo $date;
?>
输出结果:
2021-02-03 01:27:47  

看到这个时间是不是觉得奇怪,这不是当前的时间,和我们北京时间差了8个小时。其实在我们打印这句话的时候,语言的警告已经告诉我们了。

It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone ‘UTC’ for now, but please set date.timezone to select your timezone. In。

这句话的大概意思就是告诉我们依赖系统的时区设置是不安全的,必须使用日期时区设置或者date_default_timezone_set()函数设置。默认是使用UTC时间(通用协调时间Universal Time Coodrdinated,缩写UTC),UTC时间与格林威治标准时间相同。

1、修改php.ini文件来修改时区设置

找到php安装目录下的php.ini文件,找到[date]下的“;date.timezone=”选项,将其修改为“date.timezone=Asia/Hong_Kong”,然后重启apache 服务器。

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

 date_default_timezone_set(timezone);  

参数timezone为php可识别的时区名称,如果时区名称无法识别,则系统采用UTC时间。可以在PHP手册中找到各时区的名称列表。我们国家的北京时间可以使用的时区包括:PRC(中华人民共和国)、Asia/Chongqing(重庆)、Asia/Shanghai(上海)、Asia/Urumqi(乌鲁木齐),这几个都是一样的。

这个方式适合将程序上传在空间中,不能修改php.ini文件,只能使用这种方式对时区进行设置。

 <?php
date_default_timezone_set("Asia/Shanghai");
$date = date("Y-m-d H:i:s");
echo $date;
?>
输出结果:
2021-02-03 09:30:15  

二、获取时间戳

1、获得本地化时间戳

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

 语法格式:int mktime(int hour,int minute,int second,int month,int day,int year,[int is_dst]);  

时间戳是一个长整数,包含了从unix纪元(1970年1月1日)到指定时间的秒数。参数是可以从右到左省略的。省略的参数将会被设置成本地日期和时间的当前值。

hour:小时数 minute:分钟数

second:秒数(1分钟之内) month:月份数

day:天数 year:年份数。可以是两位数或者四位数,0-69对应2000-2069,70-100对应于1970-2000

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

注意:有效的时间戳范围是格林威治时间1901年12月13日20时45分54秒到2038年1月19日3时14分7秒(此范围符合32位有符号整数的最小值和最大值)。在windows系统中中此范围限制为从1970年1月1日到2038年1月19日

 <?php
$date = mktime();
echo "当前时间戳:".$date;
echo "<br/>";
echo "当前日期:".date("Y-m-d",$date);
echo "<br/>";
echo "当前时间:".date("H:i:s",$date);
?>
输出结果:
当前时间戳:1612318185
当前日期:2021-02-03
当前时间:10:09:45  

2、获取当前时间戳

time()函数也可以获取当前的unix时间戳,返回值是从unix纪元(格林威治时间1970年1月1日 00:00:00)到当前时间的秒数。

 语法格式:int time(void);  
 <?php
$date = time();
echo "当前时间戳:".$date;
echo "<br/>";
$date2 = $date + (1*24*60*60);
echo "今天日期:".date("Y-m-d",$date);
echo "<br/>";
echo "明天日期:".date("Y-m-d",$date2);
echo "<br/>";
?>
输出结果:
当前时间戳:1612318730
 今天日期:2021-02-03
 明天日期:2021-02-04  

三、获取当前日期和时间

 语法格式:date(string format,[int timestamp]);  

date() 函数返回参数timestamp按照指定格式format而产生的 字符串 。timestamp是可选的,省略就是使用当前时间。format就是指定的的日期、时间格式。这里先介绍几个时间日期的预定义变量。后面再介绍格式化。

DATE_ATOM:原子钟格式

DATE_COOKIE:HTTP Cookies格式

DATE_RSS:RSS格式

DATE_ISO8601:ISO-8601格式

DATE_W3C:World Wide Web Consortium格式

DATE_RFC850:RFC850格式

DATE_RFC822:RFC822格式

 <?php
echo "<p> DATE_ATOM: ".date(DATE_ATOM);
echo "<p> DATE_COOKIE: ".date(DATE_COOKIE);
echo "<p> DATE_RSS: ".date(DATE_RSS);
echo "<p> DATE_ISO8601: ".date(DATE_ISO8601);
echo "<p> DATE_W3C: ".date(DATE_W3C);
echo "<p> DATE_RFC850: ".date(DATE_RFC850);
echo "<p> DATE_RFC822: ".date(DATE_RFC822);
?>
输出结果:
DATE_ATOM: 2021-02-03T10:33:17+08:00
DATE_COOKIE: Wednesday, 03-Feb-2021 10:33:17 CST
DATE_RSS: Wed, 03 Feb 2021 10:33:17 +0800
DATE_ISO8601: 2021-02-03T10:33:17+0800
DATE_W3C: 2021-02-03T10:33:17+08:00
DATE_RFC850: Wednesday, 03-Feb-21 10:33:17 CST
DATE_RFC822: Wed, 03 Feb 21 10:33:17 +0800  

四、获取日期和时间信息

 语法格式:array getdate(int timestamp);  

函数返回数组形式的日期和时间信息,如果没有参数timestamp,则以当前时间为准。关联的数组元素说明如下:

seconds:秒,返回值范围0-59

minutes:分钟,返回值范围0-59

hours:小时,返回值范围0-23

mday:月份中的第几天。返回值范围1-31

wday:星期中的第几天,返回值范围0(表示星期日)- 6(表示星期六)

mon:月份数字,返回值范围1-12

year:4位数字表示的完整年份。

yday:一年中的第几天,返回值范围0-365

weekday:星期几的完整文本表示,返回值范围为Sunday-Saturday

month:月份的完整文本表示,返回值范围为January – December

0:返回从unix纪元开始到当前时间的秒数

 <?php
$arr = getdate();
echo "今天是:$arr[year]-$arr[mon]-$arr[mday]";
echo "<br/>";
echo " $arr[hours]:$arr[minutes]:$arr[seconds]  $arr[weekday] ";
echo "<br/>";
echo "今天是一年中的第 $arr[yday] 天";
?>
输出结果:
今天是:2021-2-3
 10:50:44 Wednesday 
 今天是一年中的第 33 天  

五、检验日期的有效性

 语法格式:bool checkdate(int month,int day,int year);  

其中,month的有效值是1-12,day的有效值为当月的最大天数(1-31)(如1月是31天,2月如果是闰年为29天),year的有效值是1-32767 。

返回是布尔类型,表示该日期是否有效。true为有效,false为无效。

 <?php
var_dump(checkdate(2,28,2021));
echo "<br/>";
var_dump(checkdate(2,29,2021));
echo "<br/>";
var_dump(checkdate(2,30,2021));
echo "<br/>";
var_dump(checkdate(2,31,2021));
?>
输出结果:
bool(true) 
bool(false) 
bool(false) 
bool(false)  

六、格式化日期和时间

date()函数format的格式化选项如下面所示:

d – 一个月中的第几天(从 01 到 31)

D – 星期几的文本表示(用三个字母表示)

j – 一个月中的第几天,不带前导零(1 到 31)

l(’L’ 的小写形式)- 星期几的完整的文本表示

N – 星期几的 ISO-8601 数字格式表示(1 表示 Monday[星期一],7 表示 Sunday[星期日])

S – 一个月中的第几天的英语序数后缀(2 个字符:st、nd、rd 或 th。与 j 搭配使用)

w – 星期几的数字表示(0 表示 Sunday[星期日],6 表示 Saturday[星期六])

z – 一年中的第几天(从 0 到 365)

W – 用 ISO-8601 数字格式表示一年中的星期数字(每周从 Monday[星期一]开始)

F – 月份的完整的文本表示( January [一月份] 到 December[十二月份])

m – 月份的数字表示(从 01 到 12)

M – 月份的短文本表示(用三个字母表示)

n – 月份的数字表示,不带前导零(1 到 12)

t – 给定月份中包含的天数

L – 是否是闰年(如果是闰年则为 1,否则为 0)

o – ISO-8601 标准下的年份数字

Y – 年份的四位数表示

y – 年份的两位数表示

a – 小写形式表示:am 或 pm

A – 大写形式表示:AM 或 PM

B – Swatch Internet Time(000 到 999)

g – 12 小时制,不带前导零(1 到 12)

G – 24 小时制,不带前导零(0 到 23)

h – 12 小时制,带前导零(01 到 12)

H – 24 小时制,带前导零(00 到 23)

i – 分,带前导零(00 到 59)

s – 秒,带前导零(00 到 59)

u – 微秒(PHP 5.2.2 中新增的)

e – 时区标识符(例如:UTC、GMT、Atlantic/Azores)

I(i 的大写形式)- 日期是否是在夏令时(如果是夏令时则为 1,否则为 0)

O – 格林威治时间(GMT)的差值,单位是小时(实例:+0100)

P – 格林威治时间(GMT)的差值,单位是 hours:minutes(PHP 5.1.3 中新增的)

T – 时区的简写(实例:EST、MDT)

Z – 以秒为单位的时区 偏移量 。UTC 以西时区的偏移量为负数(-43200 到 50400)

c – ISO-8601 标准的日期(例如 2013-05-05T16:34:42+00:00)

r – RFC 2822 格式的日期(例如 Fri, 12 Apr 2013 12:01:05 +0200)

U – 自 Unix 纪元(January 1 1970 00:00:00 GMT)以来经过的秒数

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

不同的国家和地区,有使用不同的时间,日期,货币和字符集。如西方国家使用Tuesday,我们国家表示星期四。

1、setlocale()函数:改变php默认的本地化环境

 语法格式:string setlocale(string category,[string locale]);  

参数category的选项如下:

LC_ALL – 包括下面的所有的设置本地化规则

LC_COLLATE – 排序次序,字符串比较

LC_CTYPE – 字符串分类和转换(例如所有字符大写或小写)

LC_MESSAGES – 系统消息格式

LC_MONETARY – 本地化环境的货币格式

LC_NUMERIC – 本地化环境的数字格式

LC_TIME – 本地化环境的日期和时间格式

参数locale如果为空,就会使用系统环境变量的locale或者lang的值,否则就会应用locale参数所指定的本地化环境。如:en_US为美国本地化环境,chs则是简体中文,cht为繁体中文。

2、strftime()函数:根据本地化环境设置来格式化输出日期和时间

 语法格式:string strftime(string format,int timestamp);  

该函数返回指定的格式化字符串对参数timestamp进行格式化输出字符串。如果没有给出timestamp则用本地时间。月份,星期和其他语言相关的字符串写法和setlocale函数设置的当前区域有关。

参数format的转换标记如下:

%a – 星期几名称的简写

%A – 星期几名称的全称

%b – 月份名称的简写

%B – 月份名称的全称

%c – 首选的日期和时间表示法

%C – 表示世纪的数字(年份除以 100,范围从 00 到 99)

%d – 一个月中的第几天(01 到 31)

%D – 时间格式,与 %m/%d/%y 表示法相同

%e – 一个月中的第几天(1 到 31)

%g – 与 %G 表示法类似,但不带世纪

%G – 与 ISO 星期数对应的 4 位数年份(见 %V)

%h – 与 %b 表示法相同

%H – 小时,使用 24 小时制(00 到 23)

%I – 小时,使用 12 小时制(01 到 12)

%j – 一年中的第几天(001 到 366)

%m – 月份(01 到 12)

%M – 分

%n – 换行符

%p – 与给定的时间值相对应的 am 或 pm

%r – a.m. 和 p.m. 的时间标记法

%R – 24 小时制的时间标记法

%S – 秒

%t – tab 制表符

%T – 当前时间,与 %H:%M:%S 表示法相同

%u – 星期几的数字表示(1 到 7),Monday[星期一] = 1。警告:在 Sun Solaris 系统中,Sunday[星期日] = 1

%U – 当年包含的周数,从第一个星期日开始,作为第一周的第一天

%V – 当年包含的 ISO 8601 格式下的周数(01 到 53),week 1 表示当年的第一周,至少要有四天,且以星期一作为周的第一天

%W – 当年包含的周数,从第一个星期一开始,作为第一周的第一天

%w – 以十进制数形式表示一周中的某天,Sunday[星期日] = 0

%x – 首选的日期表示法,不带时间

%X – 首选的时间表示法,不带日期

%y – 不包含表示世纪的数字的年份表示(范围从 00 到 99)

%Y – 包含表示世纪的数字的年份表示

%Z 或 %z – 时区名称或简写

%% – 输出一个 % 字符

 <?php
setlocale(LC_ALL,"en_US");
echo "美国格式:".strftime("%A");
echo "<br/>";
setlocale(LC_ALL,"chs");
echo "中文简体格式:".strftime("%A");
echo "<br/>";
setlocale(LC_ALL,"cht");
echo "繁体中文格式:".strftime("%A");
?>
输出结果:
美国格式:Wednesday
中文简体格式:星期三
繁体中文格式:琍戳  

注意:本页面的编码格式是gb2312,所以繁体中文的日期是乱码,将编码格式改为big5,繁体中文将显示处理,但其他文字变成乱码了,可以自行修改查看。

八、将日期和时间解析为unix时间戳

 语法格式:int strtotime(string time,[int now]);  

可以将英文文本的日期和时间解析为unix时间戳,其值是相对于参数now给出的时间。如果没有提供参数,则使用系统当前时间。

如果参数time的格式是绝对时间,则now参数不起作用。如果是相对时间,则对应的时间就是参数now来提供的。如果解析失败返回false,在5.1之前的版本失败返回-1。

 <?php
$now = strtotime("now");
echo "now:".$now;
echo "<br/>";
echo "格式化再输出:".date("Y-m-d H:i:s",$now);
echo "<br/>";
$now = strtotime("5 May 2021");
echo "5 May 2021:".$now;
echo "<br/>";
echo "格式化再输出:".date("Y-m-d H:i:s",$now);
echo "<br/>";
$now = strtotime("+3 day");
echo "+3 day:".$now;
echo "<br/>";
echo "格式化再输出:".date("Y-m-d H:i:s",$now);
echo "<br/>";
$now = strtotime("+1 week");
echo "+1 week:".$now;
echo "<br/>";
echo "格式化再输出:".date("Y-m-d H:i:s",$now);
echo "<br/>";
$now = strtotime("next Thursday");
echo "next Thursday:".$now;
echo "<br/>";
echo "格式化再输出:".date("Y-m-d H:i:s",$now);
echo "<br/>";
$now = strtotime("last Monday");
echo "last Monday:".$now;
echo "<br/>";
echo "格式化再输出:".date("Y-m-d H:i:s",$now);
echo "<br/>";
?>
输出结果:
now:1612324354
格式化再输出:2021-02-03 11:52:34
5 May 2021:1620144000
格式化再输出:2021-05-05 00:00:00
+3 day:1612583554
格式化再输出:2021-02-06 11:52:34
+1 week:1612929154
格式化再输出:2021-02-10 11:52:34
next Thursday:1612368000
格式化再输出:2021-02-04 00:00:00
last Monday:1612108800
格式化再输出:2021-02-01 00:00:00  

1、比较两个时间的大小

因为strtotime()函数返回的是时间戳格式,所以可以使用两个时间的时间戳就可以比较时间的大小。

 <?php
$date1 = date("Y-m-d H:i:s");
echo "时间1:".$date1;
echo "<br/>";
$date2= "2021-1-1 12:00:00";
echo "时间2:".$date2;
echo "<br/>";
$ts = strtotime($date1) - strtotime($date2);
if($ts>0){
echo "时间1早于时间2";
}
else{
echo "时间2早于时间1";
}
?>
输出结果:
时间1:2021-02-03 12:38:24
时间2:2021-1-1 12:00:00
时间1早于时间2  

2、实现倒计时功能

 <?php
$date1 = date("Y-m-d");
echo $date1;
echo "<br/>";
$date2 = "2021-2-11";
echo $date2;
echo "<br/>";
$s1 = strtotime($date1);
$s2 = strtotime($date2);
$ss1 = ceil(($s2-$s1)/3600);
$ss2 = ceil(($s2-$s1)/86400);
echo "离除夕还有“".$ss1."”个小时";
echo "<br/>";
echo "离除夕还有“".$ss2."”天";
?>
输出结果:
2021-02-03
2021-2-11
离除夕还有“192”个小时
 离除夕还有”8“天  

说明:ceil()函数的格式为:float ceil(float value); 该函数为取整函数,返回不小于参数value值的最小整数。如果有小数部分,则进一位。应该注意的是函数的返回类型是float型,而不是int型。

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

 语法格式:string microtime(void);  

该函数返回当前unix时间戳和微秒数。返回格式为msec sec的字符串。其中sec是当前unix时间戳,msec是微秒数。

 <?php
function run_time(){
$date = microtime();
echo "函数:".$date;
echo "<br/>";
list($msec,$sec) = explode(" ",$date);
$rs = (float)$msec+(float)$sec;
return $rs;
}
$st = run_time();
for($i=0;$i<100;$i++){
echo $i." ";
}
sleep(5); //延迟5秒
$et = run_time();
$rs = $et - $st;
echo "该实例运行了“".$rs."”秒";?>
输出结果:
函数:0.80279900 1612331272
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1  

explode()函数:根据指定字符分割字符串为数组

list() 函数:将数组中的值赋值给一些变量

sleep()函数:延迟几秒代码执行/睡眠几秒

十、其他日期和时间函数

这里只是大概介绍,参数说明可以详细看手册资料。

date_add() 添加日、月、年、时、分和秒到一个日期。

date_create_from_format() 返回一个根据指定格式进行格式化的新的 DateTime 对象。

date_create() 返回一个新的 DateTime 对象。

date_date_set() 设置一个新的日期。

date_default_timezone_get() 返回默认时区,被所有的 Date/Time 函数使用。

date_default_timezone_set() 设置默认时区,被所有的 Date/Time 函数使用。

date_diff() 返回两个日期间的差值。

date_format() 返回根据指定格式进行格式化的日期。

date_get_last_errors() 返回日期字符串中的警告/错误。

date_interval_create_from_date_string() 从字符串的相关部分建立一个 DateInterval。

date_interval_format() 格式化时间间隔。

date_isodate_set() 设置 ISO 日期。

date_modify() 修改时间戳。

date_offset_get() 返回时区偏移。

date_parse_from_format() 根据指定的格式返回一个带有指定日期的详细信息的关联数组。

date_parse() 返回一个带有指定日期的详细信息的关联数组。

date_sub() 从指定日期减去日、月、年、时、分和秒。

date_sun_info() 返回一个包含有关指定日期与地点的日出/日落和黄昏开始/黄昏结束的信息的数组。

date_sunrise() 返回指定日期与地点的日出时间。

date_sunset() 返回指定日期与地点的日落时间。

date_time_set() 设置时间。

date_timestamp_get() 返回 Unix 时间戳。

date_timestamp_set() 设置基于 Unix 时间戳的日期和时间。

date_timezone_get() 返回给定 DateTime 对象的时区。

date_timezone_set() 设置 DateTime 对象的时区。

gettimeofday() 返回当前时间。

gmdate() 格式化 GMT/UTC 日期和时间。

gmmktime() 返回 GMT 日期的 UNIX 时间戳。

gmstrftime() 根据区域设置格式化 GMT/UTC 日期和时间。

idate() 格式化本地时间/日期为整数。

localtime() 返回本地时间。

strptime() 解析由 strftime() 生成的时间/日期。

timezone_abbreviations_list() 返回包含夏令时、偏移量和时区名称的关联数组。

timezone_identifiers_list() 返回带有所有时区标识符的数值数组。

timezone_location_get() 返回指定时区的位置信息。

timezone_name_from_ abbr() 根据时区缩略语返回时区名称。

timezone_name_get() 返回时区的名称。

timezone_offset_get() 返回相对于 GMT 的时区偏移。

timezone_open() 创建一个新的 DateTimeZone 对象。

timezone_transitions_get() 返回时区的所有转换。

timezone_version_get() 返回时区数据库的版本。

明天我们来看看PHP和Web页面中的使用

文章来源:智云一二三科技

文章标题:PHP入门读书笔记(十五):日期和时间

文章地址:https://www.zhihuclub.com/77182.shtml

关于作者: 智云科技

热门文章

网站地图