mclee 's Blog
Love Leanote!
Toggle navigation
mclee 's Blog
主页
PHP
归档
标签
日期、时间和时区
无
2018-02-06 02:19:06
372
0
0
mclee
> http://php.net/manual/zh/book.datetime.php 手册,先搬为敬。 # 面向对象方式处理时间 我们应该使用 PHP 5.2.0 引入的 DateTime、DateInterval 和 DateTimeZone 类。这些类很方便,提供了简单的面向对象接口,能准确创建及处理日期、时间和时区。 ## 先设置默认时区 首先,我们要为 PHP 中处理日期和时间的函数设置默认时区。如果不设置默认时区,PHP 会显示一个 E_WARNING 消息。时区可以在运行时动态设置或在 php.ini 中设置: ``` // php.ini // ... date.timezone = 'Asia/Shanghai'; // 'Asia/Hong_Kong' 也可; ``` >网上有很多教程设置为 PRC,或 Asia/Chongqing。但 php manual 中明确说明了包含这两项的一些项只是为了向后兼容而保留,不建议使用,若要使用可能会产生些问题。 http://php.net/manual/zh/timezones.others.php ## 日期时间格式标识符  >http://php.net/manual/zh/datetime.formats.php ## DateTime 类 该类提供了一个面向对象接口,用于管理日期和时间。一个 DateTime 实例表示一个具体的日期和时间。构造方法是穿件 DateTime 新实例最简单的方式。 ``` <?php // 若不传参,创建的是一个表示当前日期和时间的实例。我们可以把一个字符串传入 DateTime 类的构造方法,指定其他日期和时间 $datetime = new DateTime(); // 传入 php 能理解的日期和时间格式,中国惯用时间可以 $datetime = new DateTime('2018-2-6 0:32:00'); // 也可以传入相对时间 $datetime = new DateTime('next Tuesday'); // 传入时间戳,需要在前面拼接一个 '@' 以告诉构造函数这是一个时间戳 $datetime = new DateTime('@' . time()); ``` 若遇到要将特别格式的数据导入的需求的话可使用 DateTime::createFromFormat() 静态方法,我们可以使用自定义的格式创建 DateTime 实例。 ``` <?php // 这里的 format 要使用方法内部规定的列表里的参数,并非之前列出的 4 种日期时间类型里的参数,否则会解析失败返回 false。 // http://php.net/manual/zh/datetime.createfromformat.php $date = DateTime::createFromFormat('Y-m-d H:i:s', '2018-2-6 0:32:00'); echo $date->getTimestamp(); ``` ## DateInterval 类 处理 DateTime 实例之前,基本要先了解 DateInterval 类。该类实例表示长度固定的时间段(两天),或者相对而言的时间段(昨天)。 **DateInterval 实例用于修改 DateTime 实例。**例如,DateTime 类提供了用于处理 DateTime 实例的 add() 和 sub() 方法。这两个方法的参数都是一个 DateInterval 实例,指定要添加到 DateTime 实例中的时间量,或者要从 DateTime 实例中减去的时间量。 实例化 DateInterval 类的方式是使用构造方法。 DateInterval 类构造方法的参数是一个字符串,表示间隔归约。间隔归约是一个以字符 P (period, 周期) 开头的字符串,后面跟着一个证书,最后是一个周期标识符,限定前面的整数。有效的周期标识符如下: * Y (年) * M (月) * D (日) * W (周) * H (时) * M (分,跟月相同的标识符) * S (秒)  >M is used to indicate both months and minutes. As noted on the referenced wikipedia page for ISO 6801 http://en.wikipedia.org/wiki/Iso8601#Durations To resolve ambiguity, "P1M" is a one-month duration and "PT1M" is a one-minute duration (note the time designator, T, that precedes the time value). ``` <?php // 创建 DateTime 实例 $datetime = new DateTime('2018-01-01 14:00:00'); // 创建长度为两周的间隔 $interval = new DateInterval('P2W'); // 另一种写法 $interval = DateInterval::createFromDateString("+2 week"); // 修改 DateTime 实例 $datetime->add($interval); echo $datetime->format('y-m-d H:i:s'); ``` ## DatePeriod 类 该类的实例是一个可迭代的对象,每一个迭代元素为 DateTime 类的实例。 有时我们需要迭代处理一定时间间隔反复出现的一系列日期时间。 ``` <?php $datetime = new DateTime('2018-01-01 14:00:00'); $interval = DateInterval::createFromDateString("-1 week"); // 3 表示从起始日期以指定时间间隔进行推导的次数,最后一个参数代表除去起始日期,默认包含。 $period = new DatePeriod($datetime, $interval, 3, DatePeriod::EXCLUDE_START_DATE); foreach ($period as $date) { // $date 为 DateTime 的实例,format 方法的参数查手册 echo $date->format('Y-m-d'), PHP_EOL; } ``` 输出如下:  ## DateTimeImmutable 类 >This class behaves the same as DateTime except it never modifies itself but returns a new object instead.
上一篇:
PDO
下一篇:
密码
0
赞
372 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册