赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 编程语言

常用的编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN


首页 > 专业技术 > 编程语言 > PHP的DataTime类
PHP的DataTime类

使用DateTime类可以自定义一个日期时间,也可以返回当前计算机的日期和时间。使用方法是先使用new DateTime()创建一个实例(对象),然后获取其中包含的信息。示例:
<?php
date_default_timezone_set("Asia/Chongqing");
$oDateTime=new DateTime();
$now=$oDateTime->format('c');
echo $now; // 返回结果 2012-01-07T10:28:17+08:00
?>
DateTime类的方法如下表:


函数

说明

setDate()

设置日期

format()

格式化一个日期

setISODate()

设置ISO时间

modify()

修改时间戳

getOffet()

获取夏令时(Daylight Saving Time,DST)的偏移量

setTime()

设置时间

getTimezone()

获取与DateTime对象对应的时区

setTimezone()

设置与DateTime对象对应的时区

add()

在一个DateTime对象上增加一段时间间隔

sub()

从一个DateTime对象减去一个时间间隔

diff()

返回两个DateTime对象所表示的时间间隔

计算机中常用的时间概念:
·计算机元年:1970年1月1日子夜(Thu, 01 Jan 1970 00:00:00 +0000),也称UNIX元年
·时间戳:Time Stamp,是一个长整数,包含了从计算机元年到设定时间之间的秒数
·GMT:Greenwich Mean Time的缩写,也就是格林尼治标准时间
·UTC:Universal Time Coordinated的缩写,也就是协调时间时间,与GMT有闰秒的区别
在配置文件php.ini中有一些配置选项会影响DateTime:
·date.default_latitude:设置默认的纬度,默认31.7667,北京为39.9,香港22.20
·date.default_longitude:设置默认的经度,默认35.2333,北京为116.3,香港144.1
·date.sunrise_zenith:设置默认的日出天顶,默认90.583333
·date.sunset_zenith:设置默认的日落天顶,默认90.583333
·date.timezone:设置默认的时区,默认空串。这里设置”Asia/Chongqing”,东八区
如果没有设置默认时区,创建DateTime实例时必须指明时区,或者之前使用函数date_default _timezone_set()设置默认的时区。

1.DateTime类的构造方法:

$oDateTime=new DateTime();
$oDateTime=new DateTime($time);
$oDateTime=new DateTime($time, $timezone);
不带参数的方法返回一个包含操作系统当前日期和时间的DateTime对象;带参数的方法返回一个自定义日期和时间的DateTime对象。参数$timezone是一个DateTimeZone对象,表示一个时区;参数$time包含可解析为日期和时间的字符串,其格式是由GNU定义的日期输入格式,比较常见的有:
1972-09-24 72-9-24 72-09-24 9/24/72 24 September 1972 24 Sept 72 24 Sep 72 Sep 24, 1972 24-sep-72 24sep72
9/24 sep 24
20:02:00.0000 20:02 8:02pm 8:02am 20:02-0500
Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat Tues Wednes Thur Thurs

2.格式化日期和时间:

使用format()方法可以格式化日期,也用来获取具体的日期和时间。语法格式:
string format($formatString)
该方法返回一个字符串,包含有日期和时间信息。参数$formatString是一个字符或多个字符的组合,每个字符表示特定的含义,根据该字符返回特定的日期和时间信息。
与完整的日期时间相关的格式字符为:


格式字符

描述

返回值示例

c

ISO8601格式的日期

2008-02-11T05:24:43+00:00

r

RFC822格式的日期

Mon, 11 Feb 2008 05:25:38 +0000

U

从计算机元年开始至今的秒数

1202707557

与日期和星期相关的格式字符:


格式字符

描述

返回值示例

d

月份中的第几天,有前导零的两位数字

01~31

D

星期中的第几天,文本表示,3个字母

Mon到Sun

j

月份中的第几天,没有前导零

1~31

l

星期几,完整的文本格式

Sunday到Saturday

N

ISO8601格式数字表示的星期中的第几天

1~7,表示星期一到星期日

S

每月天数后面的英文后缀,两个字符

返回值可以是st、nd、rd或者th

w

星期中的第几天,数字表示

0~6,表示星期日到星期六

z

年份中的第几天

0~366

W

ISO8601格式年份中的第几周,每周从周一开始

42表示当年的第42周

与年和月相关的格式字符:


格式字符

描述

返回值示例

F

月份完整的英文文本格式

January到December

m

数字表示的月份,有前导零

01到12

M

3个字母缩写表示的月份

Jan到Dec

n

数字表示的月份,没有前导零

1~12

t

给定月份所应有的天数

28~31

L

是否为闰年

如果是闰年为1,否则为0

o

ISO8601格式年份数字,类Y,星期有别

2008

Y

4位数字完整表示的年份

2008

y

两位数字表示的年份

99、08

与时间相关的格式字符:


格式字符

描述

返回值示例

a

小写的上午和下午值

am或pm

A

大写的上午和下午值

AM或PM

B

Swatch Internet标准时

000~999

g

小时,12小时格式,没有前导零

1~12

G

小时,24小时格式,没有前导零

0~23

h

小时,12小时格式,有前导零

01~12

H

小时,24小时格式,有前导零

00~23

i

有前导零的分钟数

00~59

s

秒数,有前导零

00~59

与时区相关的格式字符:


格式字符

描述

返回值示例

e

时区标识

UTC、GMT或Atlantic/Azores

I

是否为夏令时

如果是夏令时为1,否则为0

O

与格林尼治时间相差的小时数

+0200

P

与格林尼治时间GMT的差别,时分用冒号分隔

+02:00

T

本机所在的时区

EST,MDT

Z

时差偏移量的秒数,UTC西边时区为负,东边正

-43200~43200

3.修改日期和时间:

使用setDate()和setISODate()方法可以修改日期,使用setTime()方法可以修改时间,使用modify()方法可以修改时间戳。语法格式为:
setDate($year,$month,$day);
setISODate($year,$week[,$day]);
setTime($hour,$minute[,$second]);
modify($modifyString);
注意,参数$modifyString是一个相对日期格式字符串。示例:
<?php
$oDateTime=new DateTime("now",new DateTimeZone("Asia/chongqing"));
$oDateTime->setDate(2000,10,25);
$oDateTime->settime(23,50,35);
echo $oDateTime->format("r"); // 输出 “Web, 25 Oct 2000 23:50:35 +0800”
$oDateTime->modify("next Tuesday");
echo $oDateTime->format("r"); // 输出 “Tue, 31 Oct 2000 23:50:35 +0800”
?>

4.使用DateTimeZone类处理时区:

PHP内置有DateTimeZone类用来处理与时区相关的操作,使用时要先创建一个实例:
$dtz=new DateTimeZone($timezone);
参数$timezone是一个字符串,用来定义时区。示例:
$dtz=new DateTimeZone("Asia/chongqing");
这里设置的参数为“Asia/chongqing”,也就是北京、香港、台北所处的东八区。
使用DateTimeZone类的listIdentifiers()方法可以获取所有的可用时区字符串标识,返回值是一个数组,用户可以遍历该数组获取时区字符串标识。这是一个静态方法,无须实例化就可用。示例:
<?php
$timezone=DateTimeZone::listIdentifiers();
$count=count($timezone);
for ($i=0;$i<$count;$i++) {
  echo "$timezone[$i]<br>";
}
?>
也可以使用DateTimeZone类的listAbbreviations()方法获取可用时区字符串标识缩写形式,该方法返回的是一个复合数组,键名是时区字符串标识缩写形式,键值包含有dst、offset和时区名。这也是一个静态方法。示例:
<?php
$timezone=DateTimeZone::listAbbreviations();
print_r($timezone);
?>
DateTimeZone类定义中的方法如下表:


函数

说明

listAbbreviations()

静态方法,返回一个复合数组,键名为时区字符串标识缩写

listIdentifiers()

静态方法,返回数字索引数组,包含所有的时区标识符

getName()

返回当前时区名

getOffset()

返回当前时区与GMT的偏差

getTransitions()

返回一个数字索引数组,每个元素都是复合数组,包含当前时区的所有过渡期

PHP中的默认时区有几种设置和使用方法,按优先顺序:
·程序中使用date_default_timezone_set()函数设定默认时区,或者在创建DateTime示例时指定了时区
·使用环境变量TZ设置
·如果操作系统支持,程序会自行推测
·如果以上设置都不成功,返回UTC时区
用户可以使用DateTime类的getTimezone()方法返回当前所用的时区,使用setTimezone()方法设置当前所用的时区。

5.使用DateInterval类处理时间间隔:

一个DateInterval实例代表一段日期时间,可以使用下面的方法创建:
$oDtaeInterval=new DateInterval(string $interval);
参数$interval定义日期时间间隔,这是一个格式化的字符串。如果是日期,以字母P开头;如果是时间,以字母T开头。可以的字符如下表:


字符

功能描述

Y

M

D

W

星期(不能同时包含D,因为也要转换为天数)

H

小时

M

分钟

S

秒钟

例如,字符串’P2D’表示两天,’PT2S’表示2秒,’P2Y4DT6H8M’表示2年4天6小时8分钟。
注意字母的顺序,必须按照刻度由大到小的顺序排列,依次是YMDHMS或YMWHMS。示例:
<?php
$oDateInterval=new DateInterval('P2Y4DT6H8M');
print_r($oDateInterval);
?>
①createFromDateString()方法:
根据字符串的相对部分创建DateInterval对象,该方法是静态的。语法格式为:
DateInterval::createFromDateString(string $time);
参数$time定义一个可以解析的日期时间字符串,该方法只会使用其中的相对部分。示例:
<?php
print_r(DateInterval::createFromDateString("3days+5hours"));
?>
②format()方法:
该方法用来格式化日期时间间隔。语法格式为:
$oDateInterval->format(string $format);
参数$format定义格式字符,适用的格式化字符如下表(注意带有%):


格式字符

功能描述

范例

%Y

两位数表示的年份,有前导零

01, 03

%y

数字表示的年份

1, 3

%M

两位数表示的月份,有前导零

01, 03,12

%m

数字表示的月份

01, 02, 12

%D

两位数表示的天,有前导零

01, 03, 31

%d

数字表示的天

1, 3, 31

%a

总共的天数

4, 18, 8123

%H

两位数表示的小时,有前导零

01, 03, 23

%h

数字表示的小时

1, 3, 23

%I

两位数表示的分钟,有前导零

01, 03, 59

%i

数字表示的分钟

1, 3, 59

%S

两位数表示的秒,有前导零

01, 03, 57

%s

数字表示的秒

1, 3, 57

%R

当负数时显示-,正数时显示+

-, +

%r

当负数时显示-,正数时不显示

-

%%

%字符

%

示例:
<?php
$oDateInterval=new DateInterval('P2Y4DT6H8M');
$format="%Y年%M月%D天%H小时%I分%S秒";
echo $oDateInterval->format($format);  //输出 “02年00月04天06小时08分00秒,总共0天”
$format="%y年%m月%d天%h小时%i分%s秒";
echo $oDateInterval->format($format);  //输出 “2年0月4天6小时8分0秒,总共0天”
?>

6.使用日期时间间隔改变DateTime:

DateTime类也有3个方法可以处理时间间隔,见下表:


方法

功能说明

add()

在一个DateTime对象上增加一段时间间隔

sub()

从一个DateTime对象减去一个时间间隔

diff()

返回两个DateTime对象所表示的时间间隔

语法格式为:
$oDateTime->add(DateInterval $interval);
$oDateTime->sub(DateInterval $interval);
$oDateInterval=$oDateTime->diff(DateTime $datetime[, bool $absolute]);
参数$interval定义了一个DateInterval表示要增加或减去的时间间隔;参数$datetime定义另一个需要与之比较的DateTime对象;参数$absolute定义是否要返回一个绝对差,默认为false,表示不返回绝对差。示例:
<?php
$datetime=new DateTime("now");
echo $datetime->format('Y-m-d')."<br />";  // 现在的日期
$dateinterval=new DateInterval('P2Y'); // 两年一个间隔
$newdatetime=$datetime->add($dateinterval);
echo $datetime->format('Y-m-d')."<br />";
echo $newdatetime->format('Y-m-d')."<br />';
?>
示例中在当前日期上加上两年的时间间隔。该方法的返回值和原DateTime对象都是新的日期。
示例2:比较两个DateTime的不同
<?php
$format='Y-m-d H:i:s';
$datetime1=DateTime::createFromFormat($format, '2009-11-25 15:16:17');
$datetime2=DateTime::createFromFormat($format, '2010-11-25 15:16:17');
$diff=$datetime1->diff($datetime2);
print_r($diff);
?>

7.使用DatePeriod类创建时间段:

一个DatePeriod对象代表一段日期时间内的时期段。该类实现Traversable接口,因此可以使用foreach处理其中的数据。语法格式有3种:
new DatePeriod(DateTime $start, DateInterval $interval, int $recurrences[, int $options]);
new DatePeriod(DateTime $start, DateInterval $interval, DateTime $end[, int $options]);
new DatePeriod(string $isostr[, int $options]);
参数$start定义起始日期和时间;参数$interval定义一个时间段;参数$recurrences定义重复次数,也就是$interval的倍数;参数$end定义结束日期时间;参数$isostr定义一个ISO间隔字符串;参数$options可以被设置为常量DatePeriod::EXCLUDE_START_DATE,决定是否排除起始日期时间。示例:
<?php
$datetime=new DateTime("now");
$dateinterval=new DateInterval('P2Y'); // 两年为一个间隔
$period=new DatePeriod($datetime, $dateinterval, 2);
foreach ($period as $value) {
  print_r($value);
}
?>
返回的DatePeriod对象是一个值对象,其中包含了起始日期时间算起的各个时期,示例中有起始日期,相对于起始日期增加$dateinterval后的日期时间,因为定义了$recurrences,依据倍数增加的日期时间。
示例2:按间隔平分起始日期和结束日期之间的时间
<?php
$start=new DateTime("now");
$end=new DateTime("2018-09-24');
$dateinterval=new DateInterval('P2Y'); // 两年为一个间隔
$period=new DatePeriod($start, $dateinterval, $end, DatePeriod::EXCLUDE_START_DATE);
foreach ($period as $value) {
  print_r($value);
}
?>
示例中定义了参数$options排除起始日期,输出结果被分成了3个DateTime。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659