PHP函数的高级用法strtotime()
从给定日期查找星期的第二天可能涉及一些复杂的循环和if语句。在PHP中,通过使用该strtotime()函数可以非常轻松地进行操作。该函数自版本4起成为PHP核心的一部分,几乎可以采用任何时间字符串表示形式并将其转换为Unix时间戳。
最常见的用法strtotime()是将字符串转换为时间。这是一些随机示例,前两个转换日期,后两个打印或多或少相同,但是(显然)会随时间而变化。我说或多或少是因为“now”参数将返回当前时间戳,而“today”参数将返回从当天开始算起的时间戳。
echo strtotime("19 September 2009"); //印刷1253228400 echo strtotime("09/19/2009 12:00"); //印刷1253358000 echo strtotime("today"); //印刷1253314800 echo strtotime("now"); //印刷品1253389683
如您所见strtotime(),在可以接受的参数方面,它非常健壮。如果您尝试向无法解析的函数发送时间,则它将返回false。显然,如果传递类似“cat”之类的函数,它将返回false,但是有可能通过传递非美国格式的日期来破坏它而没有意识到。
该strtotime()函数希望您发送的值使用月/日/年而不是日/月/年的en_US时间格式进行格式化,因此,如果您尝试使用该格式的上述示例,该函数将返回false。
strtotime("18/09/200912:00")//returnsfalse
从表面date()上看,这似乎不是问题,但是如果您将此值传递到函数中以打印出日期,则会发现正在打印1/01/1970的日期。如果日期看起来是有效的,此效果也可能导致问题。日期10/01/2009和01/10/2009之间有很多差异,但strtotime()始终将它们分别解释为2009年1月10日和2009年10月1日,因为它将始终基于mm/dd/yyyy。解决此问题的一种方法是将日期传递为yyyy/mm/dd或ISO日期格式。在这种情况下,2009/10/01将使函数返回2009年10月1日。
要记住的另一件事是,如果要输入1969年之前的日期,则需要输入4位数字的日期。根据有关此功能的文档,如果输入两位数的日期,则它将00-69设置为2000-2069,将70-99设置为1970-1999。
也可以使用strtotime()函数对日期进行简单的数学运算。要计算给定日期的下一个日期,只需在日期字符串的末尾添加“+1天”。也可以使用多个时间段,也可以使用单数。
echodate('r',strtotime('19September200912:00+1day'));
这将打印出字符串“Sun,2009年9月20日12:00:00+0100”。日期字符串实际上是可选的,如果要计算从今天开始的第二天,则只需输入以下任意一项即可:
echo date('r', strtotime('now +1 day')); //版画,2009年9月20日,星期日23:15:29+0100 echo date('r', strtotime('today +1 day')); //2009年9月20日,星期日打印00:00:00+0100 echo date('r', strtotime('+1 day')); //版画,2009年9月20日,星期日23:15:29+0100
与上面的函数具有相同的输出(只要您在同一日期运行它)。这将与其他值和时间段一起使用。这里有一些实际的例子。
echo date('r', strtotime('19 September 2009 12:00 +23 seconds')); //印刷品,2009年9月19日,星期六12:00:23+0100 echo date('r', strtotime('19 September 2009 12:00 +28 minutes')); //印刷品,2009年9月19日,星期六12:28:00+0100 echo date('r', strtotime('19 September 2009 12:00 +1 hour')); //印刷品,2009年9月19日,星期六13:00:00+0100 echo date('r', strtotime('19 September 2009 12:00 +5 day')); //版画2009年9月24日,星期四12:00:00+0100 echo date('r', strtotime('19 September 2009 12:00 +2 weeks')); //印刷品,2009年10月3日,星期六12:00:00+0100 echo date('r', strtotime('19 September 2009 12:00 +1 month')); //版画2009年10月19日星期一12:00:00+0100 echo date('r', strtotime('19 September 2009 12:00 +3 year')); //版画2012年9月19日星期三12:00:00+0100
该函数还接受值“fortnights”,该时间单位等于14天或两周。
echodate('r',strtotime('19September200912:00+2fortnights'));//PrintsSat,17Oct200912:00:00+0100
也可以减去日期和时间。
echo date('r', strtotime('19 September 2009 12:00 -3 hours')); //印刷品,2009年9月19日,星期六09:00:00+0100 echo date('r', strtotime('19 September 2009 12:00 -4 days')); //版画,星期二,2009年9月15日12:00:00+0100 echo date('r', strtotime('19 September 2009 12:00 -3 years')); //打印周二,2006年9月19日12:00:00+0100
该strtotime()函数可以同时使用要使用的任何组合的多个值。
echo date('r', strtotime('19 September 2009 12:00 +1 day +2 weeks')); //版画2009年10月4日,星期日12:00:00+0100 echo date('r', strtotime('19 September 2009 12:00 -18 days -8 months -38 years -12 hours')); //印刷品,1971年1月1日,星期五00:00:00+0100
下面的示例块包含三个示例,前两个将使strtotime()函数达到理论最大值,而第三个将破坏该函数。这是因为它超出了Unix时间戳的范围。1901年12月13日20:45:54之前或2038年1月19日19:03:14之后的任何日期都可能导致函数返回false。这些数字表示32位有符号整数的最大和最小可能值。我说64位系统可能会朝任一方向发展2920亿年,因此,如果您使用的是63位,则在这种情况下无需担心。
echo date('r', strtotime('19 September 2009 12:00 +28 years +1 months')); //印刷品,1971年1月1日,星期五00:00:00+0100 echo date('r', strtotime('19 September 2009 12:00 -107 years -9 months -5 days')); //2037年10月19日星期一打印12:00:00+0100 echo date('r', strtotime('19 September 2009 12:00 +3456 years')); //1970年1月1日星期四01:00:00+0100打印
该strtotime()功能的最后一项功能是使用“下一个”和“最后一个”参数。使用这些参数,您可以使用所需的任何参数简单地从日期中添加或减去1。还可以将下一天和最后一天与一周中的几天相结合,以确定一周的第二天或最后一天是什么日期。这是实际使用的下一个和最后一个参数的一些示例。
echo date('r', strtotime('last month')); //版画,2009年8月19日星期三22:29:19+0100 echo date('r', strtotime('next week')); //版画,2009年9月26日,星期六22:29:19+0100 echo date('r', strtotime('last Friday')); //2009年9月18日星期五打印00:00:00+0100 echo date('r', strtotime('next Friday')); //2009年9月25日星期五打印00:00:00+0100
您还可以传入带有这些参数的日期,以确定该日期之后的日期。
echodate('r',strtotime('19September200912:00lastmonth'));//版画,2009年8月19日星期三22:29:19+0100
为了加快速度,我创建了一个函数,该函数可让您获取一周中下一个选定日期的日期。此函数采用三个参数。
$day-这是必填参数,仅是星期几。该功能将强制您输入为三个字母的速记(例如,星期五的星期五),但是可以轻松更改。
$date-这是第二个可选参数,它将使函数计算出从该日期开始的第二天的日期。如果未提供此参数,则使用当前日期。
$format-这是一个可选参数,允许您在运行时设置日期的返回格式。设置为yyyy/mm/dd。
这是功能。
function nextDayDate($day, $date = null, $format = "Y/m/d") { //Normaliseday $day = ucfirst(strtolower($day)); //Makesuredayexists $days = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'); if (!in_array($day, $days)) { return false; } //Convertdate(ifpresent) if ($date) { if (!is_int($date)) { $date = strtotime($date); } } else { $date = time(); } //Workoutdate if (date("D", $date) == $day) { //todayisfriday $currentdate = date($format, $date); } else { $currentdate = date($format, strtotime("next " . $day . " " . date('Y/m/d', $date))); } return $currentdate; }
以下是此功能的一些使用实例。请注意,当您传递无效的一周中的某天时,该函数将返回false。
echo nextDayDate("Mon"); //Prints2009/09/21 echo nextDayDate("Wed"); //Prints2009/09/23 echo nextDayDate("Inv"); //Printsnothing echo nextDayDate("Fri", time()); //Prints2009/09/25 echo nextDayDate("Mon", '2009/09/18'); //Prints2009/09/21 echo nextDayDate("Fri", '12/12/2000'); //Prints2000/12/15 echo nextDayDate("Sat", '02/06/92'); //Prints1992/02/08 echo nextDayDate("Sat", '', 'D'); //PrintsSat echo nextDayDate("Sat", null, 'd/m/Y'); //Prints19/09/2009 echo nextDayDate("Sat", '123456', 'r'); //PrintsSat, 19 Sep 2009 12:34:56 +0100
最后,使用时要记住两件事strtotime()。首先,如果您不确定时间格式,那么最好是引入一个分析日期字符串并将其重新格式化的处理步骤,或者只是手动确定日期。
第二点要警惕的是,此函数的先前版本有错误。如果计算某个月的工作日恰好在某月的第一天,那么在计算某个月的工作日时,会在计算中增加一周,或者在使用下一个参数时,会出现+2而不是+1的错误。较新版本的PHP会使事情变得更好,但是如果您要依靠绝对第二完美的值进行计算,我认为最好是以秒为单位找出该值并将其添加到时间戳中,而不是让strtotime()事情来处理。