PHP的深入了解strtotime函数的使用

在前面的文章中,我们提到,strtotime函数会随着使用strtotime上月一些条件(1个月)。
这也引出了这篇文章的写作,其中包括以下内容:
一些使用strtotime函数
strtotime函数实现的基本原理
失败的原因(strtotime - 1个月)的评价
一些使用strtotime函数
1、strtotime(Jan)和strtotime(一月)
这两个使用效果是相同的,所有这一切都回到指定的月份,如果今天的月是没有的,它将延伸到下个月。例如,在2011-03-31计算二月,代码:
复制代码代码如下所示:
回声的日期(当前H:我:S

程序将输出:2011-03-03 00:00: 00.from来看,这样的结果可能不一定是我们想要的,但它也是一个解决方案。决定是什么strtotime函数只计算月计算执行月时,这相当于设置月直接到指定的一个月,价值而扬,一月会有一个内部的价值。
2,第一关键字
首先是一个辅助关键字,它可以与周、日等组合,可以指定确认关键字的值,比如2011的第一个星期日:
复制代码代码如下所示:
回声的日期(当前H:我:S

在PHP的源代码中,第一周和第二天的合并使用是分开的。也就是说,第一天对应于一个处理操作。在最后的C实现中,一天的值被指定为1,也就是说,时间结构中的d字段被指定为1。
复制代码代码如下所示:
开关(时间->相对。first_last_day_of){
案例1:第一
时间> d=1;
打破;
案例2:最后
时间> d=0;
时>;
打破;
}

3,前一个和下一个关键词
与第一个相似,前面的关键字可以与星期日和日一起使用,来代表指定时间的前一周或前一天:
复制代码代码如下所示:
回声的日期(当前H:我:S

程序将输出:2011-01-30 00:00:00
程序要求2011-02-01的最后一个星期日。
下一个关键字与前一个关键字相反,它代表下一周或第二天。
4,最后关键字
最后一个关键字可以用作最后一个,也可以是最后一个。星期日的日期:
复制代码代码如下所示:
回声的日期(当前H:我:S

程序将输出:2011-01-30 00:00:00
当程序结束时,它的应用场景是指定日期的最后一天,相当于日期(T)的结果。2000年2月的最后一天,
复制代码代码如下所示:
回声的日期(当前H:我:S

第一个、前一个、最后一个和这个关键字属于RE文件中的同一个组。
5,后面和前面的关键词
这两个键是一天中的一个小时的前后操作,调用的格式如下所示:
复制代码代码如下所示:
回声的日期(当前H:我:S
回声的日期(当前H:我:S

15分钟后指示位置后设置指定的时间值的时间。如果是24,它将被计算在第二天0:15。
Front indicates the location of 45 minutes before setting the specified hour value for the time.If it's 0, it's 23:45 the day before.
上面的代码的输出:2011-02-02 00:15:00 2011-02-01 23:45: 00.the阵列后回和前必须等于0和小于24。
strtotime函数实现的基本原理
公文是strtotime函数:这个函数将收到的日期格式字符串包含美国英语并试图解析到Unix时间戳(自一月00:00:00 GMT 11970秒数),现在的价值相对于时间的参数,如果该参数不被当前系统时间提供。
这是一个标准的PHP内置函数,它已经存在于PHP4。strtotime函数加载在一个扩展的方式,有其充分的实现在EXT /日期目录。作为一个标准的内置函数,其定义格式也是标准,如下:
复制代码代码如下所示:
php_function(strtotime)
如果存在输入,则第二个参数没有处理。
调用相关函数,实现字符串分析和计算结果
返回结果
}

在输入处理中,我们首先认识两个参数的存在并处理它们。如果不是,我们将处理不存在的第二个参数。如果没有,我们将报告错误并返回false。
strtotime函数的第一个参数是一个字符串。这个字符串,由于其复杂性,PHP使用相同的工具,其词法分析:Re2C。在 / / /日期提取lib目录下,我们可以从parse_date.re文件看到原来再文件。当用户输入以参数形式的字符串,该字符串将被处理这个程序,匹配不同的处理功能,为不同的字符串,strtotime(昨天)称,当字符串进行分析,昨天的字符串匹配,和字符串对应的以下功能:
复制代码代码如下所示:
昨天
{
debug_output(昨天);
timelib_init;
timelib_have_relative();
timelib_unhave_time();
时间>相对> d=1;
timelib_deinit;
返回timelib_relative;
}

这里有几个关键结构:
复制代码代码如下所示:
Typedef struct Scanner {
int fd;
函数*林,指针,指针,*我,*铎,* POS;
无符号整数行;
结构timelib_error_container *错误;
结构timelib_time *时间;
const timelib_tzdb *零时介质击穿;
扫描仪};
timelib_time { typedef struct
timelib_sll Y,M,D;月、日* / / *年。
timelib_sll H,I,S;分钟,二* / / *小时。
双F分数;
分钟内的偏移量;
char * tz_abbr;时区缩写(只显示) / * * /
timelib_tzinfo * tz_info时区结构; / * * /
如果我们正在解析的话,就签署了int DST标志;
timelib_rel_time相对;
timelib_sll SSE秒自时代; / * * /
unsigned int have_time,have_date,have_zone,have_relative,have_weeknr_day;
unsigned int sse_uptodate如果上证所; / *!0成员与日期/时间成员是最新的。
unsigned int tim_uptodate如果日期/时间; / *!0名成员与上证所成员是最新的。
unsigned int is_localtime;如果当前结构代表 / 1时间,0如果是GMT.的
unsigned int zone_type时间偏移; / * 1,
* 3时区标识符,
* 2 *时区缩写
timelib_time };
timelib_rel_time { typedef struct
timelib_sll Y,M,D;年月日* / / *。
timelib_sll H,I,S;小时,分钟和秒* / / *。
在平日;店一天in'next星期一 / * * /
国际weekday_behavior;0:当前天*不* /算时继续前进1:当前天*应该*;计算。
国际first_last_day_of;
int反转;差异是否应该颠倒。
timelib_sll天数; / *有*天*,而不是当前的差异。
timelib_special特殊;
unsigned int have_weekday_relative,have_special_relative;
timelib_rel_time };

失败的原因(strtotime - 1个月)的评价
虽然strtotime(1个月)未进行评估的情况在接下来的一个月比一个月前,它在本质上是没有错的,没有理由为什么PHP可以做到这一点。我们只需要确定我们不能用这种方法,我们称它为评价失败。
我们看它的实现过程,因为没有第二个参数,所以程序使用默认的当前时间。第一个参数被传递到1个月的字符串中,这是对应于RE文件中的正则字符串:
复制代码代码如下所示:
reltextunit =(('sec|第二| 'min| 'minute| 'hour|星期| 'fortnight| 'forthnight| 'month| 'year)的''weeks'daytext | |);
relnumber( / T } * { } = { + 0-9 } * {);
相对= relnumber空间(reltextunit | 'week);

最后,相对应与一系列操作相对应。程序将识别- 1弦和在前面的月线,和月对应一个操作类型:timelib_month.after,下面的代码是对确定的数的依据和操作型:
复制代码代码如下所示:
案例timelib_month:S ->时间->相对。M =数量* relunit ->乘数;打破;

在代码中,直接记录月份的相对值减少了,但是在3月31日这样的情况下,二月没有31号,程序会自动计算下个月的日期。