当碰到unix纪元问题时strtotime怎么转时间戳(DateTime类的使用方法)

时间:2022-01-24 09:10:58

UNIX纪元时间又称POSIX时间/新纪元时间(Epoch Time):从协调世界时1970年1月1日0时0分0秒起到现在的总秒数,不包括闰秒。正值表示1970以後,负值则表示1970年以前。

Unix 2038 bug(Y2K38漏洞)

又称 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 年刚好是这个数。

strtotime()与mktime()

php中的这两个函数都受到 Unix 2038 bug的影响,当日期值大于2038年时则返回false,当小于1970年时则返回负值。

DateTime类

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 )
}

总结DateTime类的常用方法

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;
}

当碰到unix纪元问题时strtotime怎么转时间戳(DateTime类的使用方法)的更多相关文章

  1. SecureCRT是最常用的终端仿真程序,简单的说就是Windows下登录UNIX或Liunx服务器主机的软件&comma;本文主要介绍SecureCRT的使用方法和技巧

    SecureCRT是最常用的终端仿真程序,简单的说就是Windows下登录UNIX或Liunx服务器主机的软件,本文主要介绍SecureCRT的使用方法和技巧 VanDyke CRT 和 VanDyk ...

  2. VC&plus;&plus; 在使用 CImage 的Draw 输入一个图像时&comma;有时候会造成图像失真严重&comma;解决的方法如下

    VC++  在使用 CImage 的Draw 输入一个图像时,有时候会造成图像失真严重,解决的方法如下 失真主要是由于变形造成的.只要设置一下变形的模式就可以了 ::SetStretchBltMode ...

  3. 原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法

    网上看了好多java直接打印一个对象时,直接调用该类的toString方法 . 但是: Object obj=null; System.out.println(obj);//没有报错 System.o ...

  4. Repeater为空时显示&OpenCurlyDoubleQuote;暂无数据”,很方便实用方法

    Repeater为空时显示“暂无数据”,很方便实用方法 <FooterTemplate>   <asp:Label ID="lblEmptyZP" Text=&q ...

  5. extjs folder is lost解决方法 和 FineUI主题切换时 iframe内的内容主题不变的解决方法

    错误原因:extjs包和FineUI版本不一致 或者是 webconfig配置中 没有设置为任何人可访问  解放方法下载和FineUI版本相同的extjs包就ok了 解决方法:FineUI主题切换时 ...

  6. SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

    原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...

  7. (转)类(class)和结构(struct)的区别是什么?它们对性能有影响吗?&period;NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?

    转自:http://blog.****.net/lingxyd_0/article/details/8695747 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET B ...

  8. java中检测-在运行时指定对象是否是特定类的一个实例---关键字 instanceof

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. if(requ ...

  9. 看unix高级编程时遇到apue&period;h找不到的问题

    最近学习 Unix 环境高级编程这本书,第一个例子就碰到了问题,下面是解决办法. 一开始看到这本书,刚翻了几页,就觉得对味.按照书中的代码做练习时,编译代码文件提示fatal error: apue. ...

随机推荐

  1. &lbrack;spring&rsqb;03&lowbar;装配Bean

    3.1 JavaBean 3.1.1 JavaBean 是什么 JavaBean 是一种JAVA语言写成的可重用组件. 为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器. Jav ...

  2. Python数据分析之numpy学习

    Python模块中的numpy,这是一个处理数组的强大模块,而该模块也是其他数据分析模块(如pandas和scipy)的核心. 接下面将从这5个方面来介绍numpy模块的内容: 1)数组的创建 2)有 ...

  3. 【Python】Django 时间字段 最佳实践

    . python datetime from datetime import datetime datetime.now() datetime.utcnow() from datetime impor ...

  4. 一步完成 MySQL 向 Redis 迁移

    从mysql搬一个大表到redis中,你会发现在提取.转换或是载入一行数据时,速度慢的让你难以忍受.这里我就要告诉一个让你解脱的小技巧.使用“管道输出”的方式把mysql命令行产生的内容直接传递给re ...

  5. C&num; 字符串知识整理

    新知识点,只是对于本人来说而已. 系统处理文本的方式 [新知识点].NET Framework .NET Framework的定义:其包含了一个公共语言运行时(Common Language Runt ...

  6. android rawquery和query对照

    Cursor cursor = db.rawQuery("select name from *** where id=? ", new String[]{"1" ...

  7. coco2dx添加类报错

    最近刚开始学习2dx,用的vs编辑器,现在说说我使用时碰到的一点小问题: 我使用的类添加向导,但是添加的类在win32目录下,而且编译的时候总是提示找不到 .h 文件 其实,这样添加类不是很好,可以在 ...

  8. OID的编解码(即在报文中的体现)

    先上干货: 我们常见到OID的地方是SNMP和MIB,实际上理论上所有对象都可以有自己的ID.已存在的ID可以在http://www.oid-info.com/查到.这些ID在报文里并非字符串或直接的 ...

  9. Python 2、8、10、16进制间的转换

    进制转换一直是初学者所头疼的,下面就简单的列出各进制之间都是以什么方式转换的. # print('2-->8: ', oct(int('0b1010', 2))) # 2-10-8 # prin ...

  10. &lbrack;leetcode&rsqb;Symmetric Tree &commat; Python

    原题地址:https://oj.leetcode.com/problems/symmetric-tree/ 题意:判断二叉树是否为对称的. Given a binary tree, check whe ...