PHP手册-函数参考-日期与时间相关扩展

一、Calander、日期/时间、HRTime扩展的对比
 
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 Class
DateTimeImmutable — The DateTimeImmutable Class
DateTimeInterface — The DateTimeInterface Class
DateTimeZone — The DateTimeZone Class
DateInterval — The DateInterval Class
DatePeriod — The DatePeriod Class
 
Date / 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 - 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(01151990);
$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
① 使用DateTime类
如果在php.ini中没有设置时区,则需在代码中指定时区。
常用的方法有:
<?php
date_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(年) M(月) D(日) W(周) H(时) M(分) S(秒)。
间隔约定中如果既有日期又有时间,需要在日期和时间之间加上字母T,例如,间隔约定P2D表示间隔两天,间隔约定P2DT5H2M表示间隔两天五小时两分钟。
等同于DateInterval::createFromDateString('时间间隔’),如DateInterval::createFromDateString('2 day 5hour 2minute')。
常用的方法有:
<?php
date_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-18
2017-08-17
2017-08-16
2017-08-15
 
四、HRTime
HRTime扩展未安装成功,感觉用不到的样子,以后再深入研究,囧。。。
原文地址:https://www.cnblogs.com/sunshineliulu/p/7414756.html