乱象分析:
- 需要理解:时间=数值+时区
- 函数设计的过于随意,突显非OO思维的局限性。
- 涉及的转换关系: string、timestamp、Date、Array
- 最佳实践:统一到DateTime,再进行处理。
Unix Timestamp(数值)的获取
time(); //获取相对于Unix Epoch的整数型值,它代表“时间值”,它独立于时区。
时区设定的三种方法:
- php.ini的[Date]段中设置
[Date]
date.timezone ="Asia/Shanghai"
- 编码设定(优先级更高):
date_default_timezone_set('Asia/Shanghai');
ini_set('date.timezone','America/Los_Angeles');
根据分析,做出了以下测试:
//设置默认时区,否则将按GM时区
date_default_timezone_set("Asia/Shanghai");//'America/Los_Angeles'
echo "项目的默认时区为:",date_default_timezone_get(),PHP_EOL;
//timestamp转换为string
date('Y-m-d h:I:sP',time()); //按“默认时区”的当前时间(time()省略效果相同)
gmdate('Y-m-d h:I:sP',time());//按“GMT时区”的当前时间
//string转换为Date
//根据字符串和时区,生成"时间对象"(时区不设置,将按默认时区)
$date=date_create("2013-03-15 23:40:00",timezone_open("Asia/Shanghai"));
//此方法更加一般化,也更加实用
$date=date_create_from_format("d/m/Y H:i:s","15/10/2013 23:40:00",timezone_open("Asia/Shanghai"));
//Date转换为string
$fdate=date_format($date,'y-m-d H:i:s P');
//Date转换为timestamp
date_timestamp_get($date);
//timestamp转换为Date
$date=date_create();//按照默认时区的当前时间获取
date_timestamp_set($date,time());
其它的实用测试:
echo PHP_EOL,'改变时区的测试:';
$date=date_create();
echo PHP_EOL, "北京时间(默认时区):",date_format($date,'y-m-d H:i:s P');
date_timezone_set($date,timezone_open('Asia/Tokyo'));//改变时区
echo PHP_EOL, "日本东京时间:",date_format($date,'y-m-d H:i:s P');
echo PHP_EOL,'时间偏移的测试';
$d1=date_create();
date_modify($d1,'-1 Months');
echo date_format($d1,'m');
DateTime对象的使用
<?php
date_default_timezone_set('Asia/Shanghai');
//date_default_timezone_set('America/Los_Angeles');
$date1=date_create('1999-09-10 10:10:20');//默认时区
//指定时区
$date=date_create('1999-09-10 10:10:20',timezone_open('America/Los_Angeles'));
//对象方式的构建
$date=new DateTime('1999-09-10 10:10:20',timezone_open('America/Los_Angeles'));
//当前时区,当前时间
$date=new DateTime();
echo $date->format('Y-m-d H:i:sP');//比date_formate()更好的格式化方式
//添加1年2月3天4小时
$date->add(new DateInterval('P1Y2M3DT4H'));
//date_add($date,new DateInterval('P1Y1MT1H')); //函数式
$date->sub(new DateInterval('P2Y2M3DT4H'));//减的方式
//比较时间的差
$dateInterval=$date->diff($date1);
$dateInterval->y;//相关的年份数
$date->getTimezone()->getName();//获取时区
$date->setTimezone(timezone_open("'America/Los_Angeles'"));//设定时区
$date->getOffset();//获取偏移的秒数
$date->getTimestamp(); //获取时间值
$date->setTimestamp(time());//设定时间值
//$date->setDate ($year, $month, $day);//设定日期
//$date->setTime ($hour, $minute, $second=0, $microseconds=0);//设定时间