今天遇到一个bug,获取有效期值错误,在定位跟踪后发现有效期有值,如下:

$expireDate = ;  //2037-08-16 09:30:48

但是在该时间戳的基础上加上1 year后, $expireDate的值为false,而不是正确的时间戳。

<?php
$expireDate = strtotime("+1 year", $expireDate);
echo($expireDate);//31536000 转换时间格式为1971-01-01 08:00:00

网上搜索一下,说是32位的unix时间戳漏洞,称为Y2K38 漏洞。64位的系统不受此影响.

Y2K38 漏洞

Y2K38,又称 Unix Millennium Bug,此漏洞将会影响到所有  位系统下用 UNIX 时间戳整数来记录时间的 PHP,及其它编程语言。
一个整型的变量所能保存的最大时间为 年01月19 日 ::。超过这个时间后,整型数值将会溢出。
从 年 月 日开始,到世界标准时 年 月 日星期二凌晨 :: 超过 ^ – 。^ – 就是0x7FFFFFFF,相信很多编程员都看过,
在 位系统里,这表示最大的有符号整数。如果用它来表示秒数,大概相当于 68.1 年,从 年到 年刚好是这个数。
在php中一个有效的时间是从 1970-01-01 07:00:00 – 2038-01-19 03:14:07. 这个的
关于php中unix时间戳的产生
<?php
echo strtotime('2038-01-19 03:14:07').PHP_EOL; //
echo strtotime('1970-01-01 07:00:00'); // 0"Y-m-d", $expireDate);//25200

那么那如何判断定一个时间戳能顺利返回正确的时间通常有两种方法
逆向思维方法

function is_timestamp($timestamp) {
if(strtotime(date('m-d-Y H:i:s', $timestamp)) === $timestamp) {
return $timestamp;
} else {
return false;
}
}

普通的整数范围判断

$is_unixtime = ctype_digit($str) && $str <= 2147483647;

这种方法比较简单粗暴。

php 时间戳最大值的更多相关文章

  1. 分布式ID生成器 zz

    简介 这个是根据twitter的snowflake来写的.这里有中文的介绍. 如上图所示,一个64位ID,除了最左边的符号位不用(固定为0,以保证生成的ID都是正数),还剩余63位可用. 下面的代码与 ...

  2. SUSE12SP3-Mycat(3)Server.xml配置详解

    简介 server.xml 几乎保存了所有 mycat 需要的系统配置信息.其在代码内直接的映射类为 SystemConfig 类. user 标签 <user name="test& ...

  3. BZOJ4668: 冷战 [并查集 按秩合并]

    BZOJ4668: 冷战 题意: 给定 n 个点的图.动态的往图中加边,并且询问某两个点最早什 么时候联通,强制在线. 还可以这样乱搞 并查集按秩合并的好处: 深度不会超过\(O(\log n)\) ...

  4. c#分布式ID生成器

    c#分布式ID生成器   简介 这个是根据twitter的snowflake来写的.这里有中文的介绍. 如上图所示,一个64位ID,除了最左边的符号位不用(固定为0,以保证生成的ID都是正数),还剩余 ...

  5. OpenTSDB在HBase中的底层数据结构设计

    0.时序数据库 时间序列(Time Series):是一组按照时间发生先后顺序进行排列的数据点序列,通常一组时间序列的时间间隔为一恒定值(如1秒,5分钟,1小时等). 时间序列数据可被简称为时序数据. ...

  6. Flink中的多source+event watermark测试

    这次需要做一个监控项目,全网日志的指标计算,上线的话,计算量应该是百亿/天 单个source对应的sql如下 最原始的sql select pro,throwable,level,ip,`count` ...

  7. 个人训练记录(UPD 9.16)

    本文章记录一些较难的题,摘自自己的blog中的其他文章.也有些单独成章有点浪费的题也写在里面了. 2019.7.15-2019.7.21 1182F(2900) 题意:求在区间 \([a,b]\) 中 ...

  8. Go语言实现Snowflake雪花算法

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/527 每次放长假的在家里的时候,总想找点简单的例子来看看实现原理,这 ...

  9. time和datetime时间戳---python

    time模块 time模块提供各种操作时间的函数 说明:一般有两种表示时间的方式:        1.时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的 2.以数 ...

随机推荐

  1. 用cmd命令执行SQL脚本

    1.简单说明 osql 为SQL Server的命令 2.要在cmd中执行该命令,一般安装SQL Server后该命令对应的路径会自动添加到系统环境变量中. 3.-S 表示要连接的数据库 -U表示登录 ...

  2. Git 简单入门(二)

    分支管理 分支的作用 提交不完整的代码到主分支上会导致别人不能正常开发 如果等代码全部写完再提交,存在丢失每天进度的风险 详见:https://segmentfault.com/q/101000001 ...

  3. 适配iOS11

    总结在iOS11系统中出现的适配问题: 启动app发现上下有空隙,不能完全贴合屏幕----- 解决方案:添加一张尺寸为1125x2436的启动图. 隐藏导航栏的界面,会出现无法贴合屏幕顶部(一般来说, ...

  4. ndk编译ffmpeg

    #!/bin/bash NDK=/opt/android-ndk-r9d SYSROOT=$NDK/platforms/android-9/arch-arm/ TOOLCHAIN=$NDK/toolc ...

  5. Unity AssetBundle的几个加载方式

    string path = @"AssetBundles/scene/cubewall.ab"; string cacheDownloadPath = @"file:// ...

  6. 在 ubuntu 中愉快的安装 Jenkins

    这篇文章详细的记录了在 ubuntu 中安装 Jenkins 的一步又一步,因为找了很多 Linux 下安装 Jenkins 的教程,不是很满意 所以决定自己写一篇以备后用(终于让我找到了Java 不 ...

  7. Java面试题:Hibernate的二级缓存与Hibernate多表查询

    我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...

  8. MYSQL手册

    原文出处:http://www.cnblogs.com/gaofei-1/p/7152875.html MySQL配置文件 MySQL软件使用的配置文件名为my.ini,在安装目录下. MySQL常用 ...

  9. Java常用工具类练习题

    1.请根据控制台输入的特定日期格式拆分日期 如:请输入一个日期(格式如:**月**日****年) 经过处理得到:****年**月**日 提示:使用String的方法indexOf.lastIndexO ...

  10. Unable to preventDefault inside passive event listener due to target being treated as passive

    Unable to preventDefault inside passive event listener due to target being treated as passive 今天在做项目 ...