当碰到unix纪元问题时strtotime怎么转时间戳(DateTime类的使用方法)
2016-09-12 18:01
453 查看
UNIX纪元时间又称POSIX时间/新纪元时间(Epoch Time):从协调世界时1970年1月1日0时0分0秒起到现在的总秒数,不包括闰秒。正值表示1970以後,负值则表示1970年以前。
[b]Unix 2038 bug(Y2K38漏洞)[/b]
又称 Unix Millennium Bug,此漏洞将会影响到所有 32 位系统下用 UNIX 时间戳整数来记录时间的 PHP,及其它编程语言。一个整型的变量所能保存的最大时间为 2038 年01月19 日 03:14:07。超过这个时间后,整型数值将会溢出。从 1970 年 01 月 01 日开始,到世界标准时 2038 年 01 月 19 日星期二凌晨 03:14:07 超过 2^31 – 1。2^31 – 1 就是0x7FFFFFFF,相信很多编程员都看过,在 32 位系统里,这表示最大的有符号整数。如果用它来表示秒数,大概相当于 68.1 年,从 1970 年到 2038 年刚好是这个数。
[b]strtotime()与mktime()[/b]
php中的这两个函数都受到 Unix 2038 bug的影响,当日期值大于2038年时则返回false,当小于1970年时则返回负值。
[b]DateTime类
[/b]
PHP 从 5.2 版本开始引入了一个 DateTime 的类,用以解决Y2K38漏洞问题,以下是DateTime类的方法:
[b]总结DateTime类的常用方法[/b]
1、输出当前时间
2、输出给定时间
3、根据给定的时间格式化为需要的时间
4、输出Unix时间戳
5、根据给定的时间戳输出格式化日期
6、两个日期进行比较,年与年、月与月、日与日。。。。
7、日期加减
DateInterval构造函数的参数是一个表示时间间隔约定的字符串,这个时间间隔约定以字母P开头,后面跟着一个整数,最后是一个周期标识符,限定前面的整数。有效周期标识符如下:Y(年)、M(月)、D(日)、W(周)、H(时)、M(分)、S(秒),间隔约定中既可以有日期也可以有时间,用字母T分割。例如:间隔两天5小时,P2DT5H2M;
8、重置当前时间的日期
9、重置当前时间的时间部分
10、日期的迭代
[b]Unix 2038 bug(Y2K38漏洞)[/b]
又称 Unix Millennium Bug,此漏洞将会影响到所有 32 位系统下用 UNIX 时间戳整数来记录时间的 PHP,及其它编程语言。一个整型的变量所能保存的最大时间为 2038 年01月19 日 03:14:07。超过这个时间后,整型数值将会溢出。从 1970 年 01 月 01 日开始,到世界标准时 2038 年 01 月 19 日星期二凌晨 03:14:07 超过 2^31 – 1。2^31 – 1 就是0x7FFFFFFF,相信很多编程员都看过,在 32 位系统里,这表示最大的有符号整数。如果用它来表示秒数,大概相当于 68.1 年,从 1970 年到 2038 年刚好是这个数。
[b]strtotime()与mktime()[/b]
php中的这两个函数都受到 Unix 2038 bug的影响,当日期值大于2038年时则返回false,当小于1970年时则返回负值。
[b]DateTime类
[/b]
PHP 从 5.2 版本开始引入了一个 DateTime 的类,用以解决Y2K38漏洞问题,以下是DateTime类的方法:
DateTime implements DateTimeInterface { /* 常量 */ const string ATOM = "Y-m-d\TH:i:sP" ; const string COOKIE = "l, d-M-Y H:i:s T" ; const string ISO8601 = "Y-m-d\TH:i:sO" ; const string RFC822 = "D, d M y H:i:s O" ; const string RFC850 = "l, d-M-y H:i:s T" ; const string RFC1036 = "D, d M y H:i:s O" ; const string RFC1123 = "D, d M Y H:i:s O" ; const string RFC2822 = "D, d M Y H:i:s O" ; const string RFC3339 = "Y-m-d\TH:i:sP" ; const string RSS = "D, d M Y H:i:s O" ; const string W3C = "Y-m-d\TH:i:sP" ; /* 方法 */ public __construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] ) public DateTime add ( DateInterval $interval ) public static DateTime createFromFormat ( string $format , string $time [, DateTimeZone $timezone = date_default_timezone_get() ] ) public static array getLastErrors ( void ) public DateTime modify ( string $modify ) public static DateTime __set_state ( array $array ) public DateTime setDate ( int $year , int $month , int $day ) public DateTime setISODate ( int $year , int $week [, int $day = 1 ] ) public DateTime setTime ( int $hour , int $minute [, int $second = 0 ] ) public DateTime setTimestamp ( int $unixtimestamp ) public DateTime setTimezone ( DateTimeZone $timezone ) public DateTime sub ( DateInterval $interval ) public DateInterval diff ( DateTimeInterface $datetime2 [, bool $absolute = false ] ) public string format ( string $format ) public int getOffset ( void ) public int getTimestamp ( void ) public DateTimeZone getTimezone ( void ) public __wakeup ( void ) }
[b]总结DateTime类的常用方法[/b]
1、输出当前时间
$date_time = new DateTime(); echo $date_time->format('Y-m-d H:i:s'); //输出结果为:2016-09-12
2、输出给定时间
$date_time = new DateTime('2016-09-12'); print_r($date_time); //输出结果为: DateTime Object ( [date] => 2016-06-13 00:00:00.000000 [timezone_type] => 3 [timezone] => PRC )
3、根据给定的时间格式化为需要的时间
$date_time = DateTime::createFromFormat('Ymd','20160912'); echo $date_time->format('Y-m-d');
4、输出Unix时间戳
$date_time = new DateTime('2016-09-12'); echo $date_time->format('U');
5、根据给定的时间戳输出格式化日期
$date_time = new DateTime(); $date_time->setTimestamp(1473609600); echo $date_time->format('Y-m-d H:i:s');
6、两个日期进行比较,年与年、月与月、日与日。。。。
$start_time = new DateTime('2016-09-12 00:00:00'); $end_time = new DateTime('3016-09-12 00:00:00'); $inberval = $start_time->diff($end_time); print_r($inberval); //输出结果为: DateInterval Object ( [y] => 1000 [m] => 0 [d] => 0 [h] => 0 [i] => 0 [s] => 0 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 [days] => 365242 [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0 )
7、日期加减
DateInterval构造函数的参数是一个表示时间间隔约定的字符串,这个时间间隔约定以字母P开头,后面跟着一个整数,最后是一个周期标识符,限定前面的整数。有效周期标识符如下:Y(年)、M(月)、D(日)、W(周)、H(时)、M(分)、S(秒),间隔约定中既可以有日期也可以有时间,用字母T分割。例如:间隔两天5小时,P2DT5H2M;
$date_time = new DateTime(); $interval = new DateInterval('P2DT5H2M'); $date_time->add($interval); echo $date_time->format('Y-m-d H:i:s').'<br>'; $interval = DateInterval::createFromDateString('+1 month'); $date_time->add($interval); echo $date_time->format('Y-m-d H:i:s').'<br>'; $date_time->sub($interval); echo $date_time->format('Y-m-d H:i:s');
8、重置当前时间的日期
$date_time = new DateTime(); $date_time->setDate(2015,10,1); echo $date_time->format('Y-m-d');
9、重置当前时间的时间部分
$date_time = new DateTime(); $date_time->setTime(13,10,1); echo $date_time->format('Y-m-d H:i:s');
10、日期的迭代
通过DatePeriod类实现日期迭代,它的构造方法接受四个参数: 1、日期实例,表示迭代开始的日期和时间; 2、DateInterval实例,表示下一个日期和时间的间隔; 3、次数,表示迭代的次数; 4、可选参数,显式指定周期的结束日期和时间。如果迭代时排除开始日期和时间,可设为DatePeriod::EXCLUDE_START_DATE);
$date_time = new DateTime(); $interval = DateInterval::createFromDateString('-1 day'); $period = new DatePeriod($date_time, $interval, 3,DatePeriod::EXCLUDE_START_DATE); foreach ($period as $date) { echo $date->format('Y-m-d'), PHP_EOL; }
相关文章推荐
- SQL 2005忘记sa账号密码怎么办?本人碰到的问题,搜集的解决办法,很使用,现分享个大家
- [转]ExtJs中使用中碰到的三个问题的解决方法
- Android Studio 怎么添加使用第三方jar包及无法编译的问题解决方法
- PHP时间戳 strtotime()使用方法和技巧
- strtotime()方法时间效应问题
- 滴水穿石--使用VC6.0碰到的两个问题及其解决方法
- iOS里面消除使用代理调用方法时间警告问题
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 使用ECharts碰到的一些问题和解决方法
- “超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。”问题的解决方法
- InstallShield 工程类型MSI 使用过程中碰到的问题及解决方法。
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 使用strtotime和mktime时参数为0时返回1999-11-30的时间戳问题
- ASP.NET中使用FCKeditor 2.6.3碰到些常见问题的解决方法
- 使用OWC 做图表时按周、月、年设置时间刻度是参数无效问题解决方法
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 第一次使用jdbc连接postgre数据库碰到的问题及解决方法
- 转载:PHP时间戳 strtotime()使用方法和技巧
- 使用strtotime和mktime时参数为0时返回1999-11-30的时间戳问题