设置默认时区有两种方式,首先我们要为PHP中处

作者: 编程  发布:2019-09-25

一、Calander、日期/时间、HRTime扩展的对比

处理日期和时间需要考虑很多事情,例如日期的格式、时区、闰年和天数各异的月份,自己处理太容易出错了,我们应该使用PHP 5.2.0引入的DateTime、DateIntervel和DateTimeZone这些类帮助我们创建及处理日期、时间和时区。

处理日期和时间需要考虑很多事情,例如日期的格式、时区、闰年和天数各异的月份,自己处理太容易出错了,我们应该使用PHP 5.2.0引入的DateTime、DateIntervel和DateTimeZone这些类帮助我们创建及处理日期、时间和时区。

Calendar 日期/时间 HRTime
简介 历法扩展集包括了一系列用于在不同历法间进行转换的函数,它是以Julian Day计数为中介或标准来进行的。 Julian Day计数是以公元前的4713年的1月1日为起点的一种计数法。为了在不同历法间进行转换,你首先要转换成Julian Day计数,然后再转换为你所需要的历法。 使用这些函数获取运行 PHP 的服务器的日期和时间或者把日期和时间格式化成不同格式的字符串。 这些函数依赖于服务器的区域设置, 使用它们时要考虑夏令时 (例如:使用 $date = strtotime('+7 days', $date) 而不是 $date += 7*24*60*60) 和闰年的情况。 HRTime扩展实现了一个高分辨率的秒表类(a high resolution StopWatch class)。它在不同的平台上使用最好的API,可高达纳秒,也可以使用低级别的API实现一个自定义秒表。
安装 构建此扩展不需要其他扩展。使用本类函数,需要在编译 PHP 时加上 --enable-calendar 。 构建此扩展不需要其他扩展。使用这些函数不需要安装,它们是 PHP 核心的一部分。 需安装此 PECL 扩展
配置 没有在 php.ini 中定义配置指令。此扩展没有定义资源类型。 这些函数的行为受 php.ini 中的设置影响。date.timezone —在未设定 TZ 环境变量时用于所有日期/时间函数的默认时区。
函数 cal_days_in_month — 返回某个历法中某年中某月的天数cal_from_jd — 转换Julian Day计数到一个支持的历法。cal_info — 返回选定历法的信息cal_to_jd — 从一个支持的历法转变为Julian Day计数。easter_date — 得到指定年份的复活节午夜时的Unix时间戳。easter_days — 得到指定年份的3月21日到复活节之间的天数FrenchToJD — 从一个French Republican历法的日期得到Julian Day计数。GregorianToJD — 转变一个Gregorian历法日期到Julian Day计数JDDayOfWeek — 返回星期的日期JDMonthName — 返回月份的名称JDToFrench — 转变一个Julian Day计数到French Republican历法的日期JDToGregorian — 转变一个Julian Day计数为Gregorian历法日期jdtojewish — 转换一个julian天数为Jewish历法的日期JDToJulian — 转变一个Julian Day计数到Julian历法的日期jdtounix — 转变Julian Day计数为一个Unix时间戳JewishToJD — 转变一个Jewish历法的日期为一个Julian Day计数JulianToJD — 转变一个Julian历法的日期为Julian Day计数unixtojd — 转变Unix时间戳为Julian Day计数 DateTime— The DateTime ClassDateTimeImmutable— The DateTimeImmutable ClassDateTimeInterface— The DateTimeInterface ClassDateTimeZone — The DateTimeZone ClassDateInterval — The DateIntervalClassDatePeriod — The DatePeriodClassDate / Time 函数— Date / Time 函数及上述几个类中的方法别名

设置默认时区

设置默认时区

二、Calendar作为参数的历法名字可以有:0 or CAL_GREGORIAN - Gregorian Calendar 1 or CAL_JULIAN - Julian Calendar 2 or CAL_JEWISH - Jewish Calendar 3 or CAL_FRENCH

首先我们要为PHP中处理日期和时间的函数设置默认时区,如果不设置的话,PHP会显示一个E_WARNING消息,设置默认时区有两种方式,可以像下面这样在php.ini中设置:

首先我们要为PHP中处理日期和时间的函数设置默认时区,如果不设置的话,PHP会显示一个E_WARNING消息,设置默认时区有两种方式,可以像下面这样在php.ini中设置:

  • French Revolutionary Calendar 觉得很有用的函数有:① 获得公历所有月份和月份缩写。cal_info — 返回选定历法的信息语法:array cal_info ([ int $calendar = -1 ] ),历法信息以一个数组的形式返回,包含的元素有历法名称,历法代码,月份,月份的缩写和单月的最多天数。 <?php// $info = cal_info(); // 没有指定calendar参数,默认值是-1,返回所有历法信息$info = cal_info(0); // 公历 print_r($info);输出:Array( [months] => Array ( [1] => January [2] => February [3] => March [4] => April [5] => May [6] => June [7] => July [8] => August [9] => September [10] => October [11] => November [12] => December ) [abbrevmonths] => Array ( [1] => Jan [2] => Feb [3] => Mar [4] => Apr [5] => May [6] => Jun [7] => Jul [8] => Aug [9] => Sep [10] => Oct [11] => Nov [12] => Dec ) [maxdaysinmonth] => 31 [calname] => Gregorian [calsymbol] => CAL_GREGORIAN)② 根据某个Unix时间戳获得对应的详细历法信息。unixtojd — 转变Unix时间戳为Julian Day计数语法:int unixtojd ([ int $timestamp = time,根据指定的Unix时间戳timestamp,返回Julian天数。如果没有指定时间戳则返回当前日期的天数。 cal_from_jd — 转换Julian Day计数到一个支持的历法。语法:array cal_from_jd ( int $jd , int $calendar ),根据给定的Julian day的jd 天数转换成特定历法calendar中的日期。<?php// $today = unixtojd(mktime(0, 0, 0, 8, 17, 2003));$today = unixtojd(); $jd = cal_from_jd($today, CAL_GREGORIAN); // 或$jd = cal_from_jd($today, 0); print_r($jd);输出:Array( [date] => 8/17/2017 [month] => 8 [day] => 17 [year] => 2017 [dow] => 4 [abbrevdayname] => Thu [dayname] => Thursday [abbrevmonth] => Aug [monthname] => August)③ 根据具体的年月日获得对应的详细历法信息。cal_to_jd — 从一个支持的历法转变为Julian Day计数。语法:int cal_to_jd ( int $calendar , int $month , int $day , int $year ),从一个给定的历法日期计算出Julian天数,其中month,day,year都是数字形式。cal_from_jd — 同上<?php$jd = cal_to_jd(0,11,5,1990); $cal = cal_from_jd($jd, 0); print_r($cal);输出:Array( [date] => 11/5/1990 [month] => 11 [day] => 5 [year] => 1990 [dow] => 1 [abbrevdayname] => Mon [dayname] => Monday [abbrevmonth] => Nov [monthname] => November)三、Date / Time[参考资料] 总结PHP中DateTime的常用方法① 使用DateTime类如果在php.ini中没有设置时区,则需在代码中指定时区。常用的方法有:<?phpdate_default_timezone_set('Asia/Shanghai’);// 输出当前时间$date = new DateTime(); echo $date->format('Y-m-d H:i:s'); // 输出:2017-08-17 18:13:13 // 获取特定时间$date = new DateTime('2014-05-04'); echo $date->format('Y-m-d H:i:s'); // 输出:2014-05-04 00:00:00 ②使用DateInterval类DateInterval表示一段时间间隔,可以对时间进行加减处理。DateInterval构造函数的参数是一个表示时间间隔约定的字符串,以字母P开头,后面跟着一个整数,最后是一个周期标识符,限定前面的整数。有效周期标识符为: Y D H S。间隔约定中如果既有日期又有时间,需要在日期和时间之间加上字母T,例如,间隔约定P2D表示间隔两天,间隔约定P2DT5H2M表示间隔两天五小时两分钟。等同于DateInterval::createFromDateString('时间间隔’),如DateInterval::createFromDateString('2 day 5hour 2minute')。常用的方法有:<?phpdate_default_timezone_set('Asia/Shanghai’);// 创建几天前/后的时间$date1 = new DateTime(); $date2 = new DateTime(); $interval = new DateInterval('P2DT5H'); // 等同于DateInterval::createFromDateString('2 day 5hour'); $date1->add($interval);echo $date1->format('Y-m-d H:i:s'); // 输出:2017-08-20 05:03:50 echo "<pre>"; $date2->sub($interval);echo $date2->format('Y-m-d H:i:s'); // 输出:2017-08-15 19:03:50 // 还可以用modify方法创建几天前/后的时间$date = new DateTime(); $date->modify('+1 day');echo $date->format('Y-m-d H:i:s'); // 输出:2017-08-19 00:16:38 // 计算时间间隔$date1 = new DateTime(); $date2 = new DateTime('2016-12-15'); $diff = $date1->diff($date2); // 顺序无关,也可以是$date2->diff($date1); print_r($diff);//格式化输出echo $diff->format("时间间隔为 %Y years %m months and %d days”); 输出:DateInterval Object( [y] => 0 [m] => 8 [d] => 3 [h] => 0 [i] => 48 [s] => 54 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 1 [days] => 246 [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0)时间间隔为 00 years 8 months and 3 days③ 使用DatePeriod类DatePeriod类的构造方法必须提供三个参数:一个DateTime实例,表示迭代开始的日期和时间;一个DateInterval实例,表示下一个日期和时间的间隔;一个整数,表示迭代的总次数;第四个参数是可选的,用于显式指定周期的结束日期和时间,如果迭代时想要排除开始日期和时间,可以把构造方法的最后一个参数设为DatePeriod::EXCLUDE_START_DATE常量。// 迭代输出距离当前日期的前几天日期。$datetime = new DateTime(); $interval = DateInterval::createFromDateString('-1 day'); $period = new DatePeriod($datetime, $interval, 3); foreach ($period as $date) { echo $date->format('Y-m-d'), PHP_EOL; }输出:2017-08-182017-08-172017-08-162017-08-15四、HRTimeHRTime扩展未安装成功,感觉用不到的样子,以后再深入研究,囧。。。

date.timezone = 'Asia/Shanghai';

date.timezone='Asia/Shanghai';

也可以在运行时使用date_default_timezone_set()函数设置:

```也可以在运行时使用date_default_timezone_set()函数设置:

<?php
date_default_timezone_set('Asia/Shanghai');

date_default_timezone_set('Asia/Shanghai');

这两种方式都要求使用有效的时区标识符,PHP完整的时区标识符可以在这里找到:

这两种方式都要求使用有效的时区标识符,PHP完整的时区标识符可以在这里找到:

DateTime类

##DateTime类

DateTime类提供了一个面向对象接口,用于管理日期和时间,一个DateTime实例表示一个具体的日期和时间,DateTime构造方法是创建DateTime新实例最简单的方式:

DateTime类提供了一个面向对象接口,用于管理日期和时间,一个DateTime实例表示一个具体的日期和时间,DateTime构造方法是创建DateTime新实例最简单的方式:

<?php
$datetime = new DateTime();

```php

如果没有参数,DateTime类的构造方法创建的是一个表示当前日期和时间的实例。我们可以把一个字符串传入DateTime类的构造方法以便指定日期和时间:

$datetime=newDateTime();

<?php
$datetime = new DateTime('2016-06-06 10:00 pm');

如果没有参数,DateTime类的构造方法创建的是一个表示当前日期和时间的实例。我们可以把一个字符串传入DateTime类的构造方法以便指定日期和时间:

注:传入的字符串参数必须是有效的日期和时间格式(
理想情况下,我们会指定PHP能理解的日期和时间格式,可是实际情况并不总是如此,有时我们必须处理其它格式或出乎意料的格式,这时我们可以通过DateTime提供的静态方法createFromFormat来使用自定义的格式创建DateTime实例,该方法的第一个参数是表示日期和时间格式的字符串,第二个参数是要使用这种格式的日期和时间字符串:

$datetime=newDateTime('2016-06-06 10:00 pm');

<?php
$datetime = DateTime::createFromFormat('M j, Y H:i:s', 'June 6, 2016 22:00:00');
注:也许你很眼熟,没错,DateTime::createFromFormat和date函数类似。可用的日期时间格式参考这里:

注:传入的字符串参数必须是有效的日期和时间格式(http://php.net/manual/zh/datetime.formats.php)

DateInterval类

理想情况下,我们会指定PHP能理解的日期和时间格式,可是实际情况并不总是如此,有时我们必须处理其它格式或出乎意料的格式,这时我们可以通过DateTime提供的静态方法createFromFormat来使用自定义的格式创建DateTime实例,该方法的第一个参数是表示日期和时间格式的字符串,第二个参数是要使用这种格式的日期和时间字符串:

处理DateTime实例之前需要先了解DateInterval类,DateInterval实例表示长度固定的时间段(比如两天),或者相对而言的时间段(例如昨天),我们通常使用该类的实例来修改DateTime实例。例如,DateTime提供了用于处理DateTime实例的add和sub方法,这两个方法的参数是一个DateInterval实例,表示从DateTime中增加的时间量或减少的时间量。

$datetime=DateTime::createFromFormat('M j, Y H:i:s','June 6, 2016 22:00:00');

我们使用构造函数实例化DateInterval实例,DateInterval构造函数的参数是一个表示时间间隔约定的字符串,这个时间间隔约定以字母P开头,后面跟着一个整数,最后是一个周期标识符,限定前面的整数。有效周期标识符如下:

注:也许你很眼熟,没错,DateTime::createFromFormat和date函数类似。可用的日期时间格式参考这里:http://php.net/manual/zh/datetime.createfromformat.php

Y(年)
M(月)
D(日)
W(周)
H(时)
M(分)
S(秒)

DateInterval类

间隔约定中既可以有时间也可以有日期,如果有时间需要在日期和时间之间加上字母T,例如,间隔约定P2D表示间隔两天,间隔约定P2DT5H2M表示间隔两天五小时两分钟。

处理DateTime实例之前需要先了解DateInterval类,DateInterval实例表示长度固定的时间段(比如两天),或者相对而言的时间段(例如昨天),我们通常使用该类的实例来修改DateTime实例。例如,DateTime提供了用于处理DateTime实例的add和sub方法,这两个方法的参数是一个DateInterval实例,表示从DateTime中增加的时间量或减少的时间量。

下面的实例演示了如何使用add方法将DateTime实例表示的日期和时间向后推移一段时间:

我们使用构造函数实例化DateInterval实例,DateInterval构造函数的参数是一个表示时间间隔约定的字符串,这个时间间隔约定以字母P开头,后面跟着一个整数,最后是一个周期标识符,限定前面的整数。有效周期标识符如下:

<?php
//创建DateTime实例
$datetime = new DateTime('2016-06-06 22:00:00');

Y(年)

//创建长度为两天的间隔
$interval = new DateInterval('P2D');

M(月)

//修改DateTime实例
$datetime->add($interval);
echo $datetime->format('Y-m-d H:i:s');

D(日)

我们还可以创建反向的DateInterval实例:

W(周)

<?php
$datetime = new DateTime();
$interval = DateInterval::createFromDateString('-1 day');
$period = new DatePeriod($datetime, $interval, 3);
foreach ($period as $date) {
    echo $date->format('Y-m-d'), PHP_EOL;
}

H(时)

以上代码输出为:

M(分)

2016-06-06
2016-06-05
2016-06-04
2016-06-03

S(秒)

DateTimeZone类

间隔约定中既可以有时间也可以有日期,如果有时间需要在日期和时间之间加上字母T,例如,间隔约定P2D表示间隔两天,间隔约定P2DT5H2M表示间隔两天五小时两分钟。

PHP使用DateTimeZone类表示时区,我们只需要把有效的时区标识符传递给DateTimeZone类的构造函数:

下面的实例演示了如何使用add方法将DateTime实例表示的日期和时间向后推移一段时间:

<?php
$timezone = new DateTimeZone('Asia/Shanghai');

//创建DateTime实例

创建DateTime实例通常需要使用DateTimeZone实例,DateTime类构造方法的第二个参数(可选)就是一个DateTimeZone实例,传入这个参数后,DateTime实例的值以及对这个值的所有修改都相对于这个指定的时区,如果不传入则使用的是前面设置的默认时区:

$datetime=newDateTime('2016-06-06 22:00:00');

<?php
$timezone = new DateTimeZone('Asia/Shanghai');
$datetime = new DateTime('2016-06-06', $timezone);
实例化之后还可以使用setTimezone方法修改DateTime实例的时区:

//创建长度为两天的间隔

<?php
$timezone = new DateTimeZone('Asia/Shanghai');
$datetime = new DateTime('2016-06-06', $timezone);
$datetime->setTimezone(new DateTimeZone('Asia/Hong_kong'));

$interval=newDateInterval('P2D');

DatePeriod类

//修改DateTime实例

有时我们需要迭代处理一段时间内反复出现的一系列日期和时间,DatePeriod类可以解决这个问题(前面已经用到过),DatePeriod类的构造方法接受三个参数而且都必须提供:

$datetime->add($interval);

一个DateTime实例,表示迭代开始的日期和时间
一个DateInterval实例,表示下一个日期和时间的间隔
一个整数,表示迭代的总次数

echo $datetime->format('Y-m-d H:i:s');

DatePeriod是迭代器,每次迭代都会产出一个DateTime实例。DatePeriod的第四个参数是可选的,用于显式指定周期的结束日期和时间,如果迭代时想要排除开始日期和时间,可以把构造方法的最后一个参数设为DatePeriod::EXCLUDE_9159.com,START_DATE常量:

我们还可以创建反向的DateInterval实例:

<?php
$datetime = new DateTime();
$interval = new DateInterval('P2D');
$period = new DatePeriod($datetime, $interval, 3, DatePeriod::EXCLUDE_START_DATE);
foreach ($period as $date) {
    echo $date->format('Y-m-d H:i:s'), PHP_EOL;
}

$datetime=newDateTime();

打印的结果是:

$interval=DateInterval::createFromDateString('-1 day');

2016-06-08
2016-06-10
2016-06-12

$period=newDatePeriod($datetime,$interval,3);

nesbot/carbon日期组件

foreach($periodas$date){

如果经常需要处理日期和时间,应该使用nesbot/carbon组件(https://github.com/briannesbitt/Carbon),Laravel框架也是使用了这个组件处理日期和时间,该组件集成了常用的日期及时间处理API,其底层正是使用了我们上面提到的几个日期时间处理类实现了各种功能,有兴趣可以去研究下。

echo $date->format('Y-m-d'),PHP_EOL;

}

以上代码输出为:

2016-06-06

2016-06-05

2016-06-04

2016-06-03

DateTimeZone类

PHP使用DateTimeZone类表示时区,我们只需要把有效的时区标识符传递给DateTimeZone类的构造函数:

$timezone=newDateTimeZone('Asia/Shanghai');

创建DateTime实例通常需要使用DateTimeZone实例,DateTime类构造方法的第二个参数(可选)就是一个DateTimeZone实例,传入这个参数后,DateTime实例的值以及对这个值的所有修改都相对于这个指定的时区,如果不传入则使用的是前面设置的默认时区:

$timezone=newDateTimeZone('Asia/Shanghai');

$datetime=newDateTime('2016-06-06',$timezone);

实例化之后还可以使用setTimezone方法修改DateTime实例的时区:

$timezone=newDateTimeZone('Asia/Shanghai');

$datetime=newDateTime('2016-06-06',$timezone);

$datetime->setTimezone(newDateTimeZone('Asia/Hong_kong'));

DatePeriod类

有时我们需要迭代处理一段时间内反复出现的一系列日期和时间,DatePeriod类可以解决这个问题(前面已经用到过),DatePeriod类的构造方法接受三个参数而且都必须提供:

一个DateTime实例,表示迭代开始的日期和时间

一个DateInterval实例,表示下一个日期和时间的间隔

一个整数,表示迭代的总次数

DatePeriod是迭代器,每次迭代都会产出一个DateTime实例。DatePeriod的第四个参数是可选的,用于显式指定周期的结束日期和时间,如果迭代时想要排除开始日期和时间,可以把构造方法的最后一个参数设为DatePeriod::EXCLUDE_START_DATE常量:

$datetime=newDateTime();

$interval=newDateInterval('P2D');

$period=newDatePeriod($datetime,$interval,3,DatePeriod::EXCLUDE_START_DATE);

foreach($periodas$date){

echo $date->format('Y-m-d H:i:s'),PHP_EOL;

}

打印的结果是:

2016-06-08

2016-06-10

2016-06-12

nesbot/carbon日期组件

如果经常需要处理日期和时间,应该使用nesbot/carbon组件(https://github.com/briannesbitt/Carbon)

如果你觉得眼前需要更好的提高你可以来千锋学PHP,国内最好的PHP机构。

本文由9159.com发布于编程,转载请注明出处:设置默认时区有两种方式,首先我们要为PHP中处

关键词:

上一篇:没有了
下一篇:没有了