mr.*_*r.b 58 php date strtotime
相对于当前日期,我需要获得上个月和上年.
但是,请参阅以下示例.
// Today is 2011-03-30
echo date('Y-m-d', strtotime('last month'));
// Output:
2011-03-02
Run Code Online (Sandbox Code Playgroud)
由于2月和3月的天数不同,这种行为是可以理解的(在某一点上),上面的例子中的代码是我需要的,但是每个月的1号和28号之间只能正确地工作100%.
那么,如何以date("Y-m")最优雅的方式获得上个月和一年(想想),这适用于一年中的每一天?最佳解决方案将基于strtotime参数解析.
更新.稍微澄清一下要求.
我有一段代码可以获得过去几个月的统计数据,但我首先显示上个月的统计数据,然后在需要时加载其他月份.这是预期的目的.所以,在这个月里,我想知道我应该在哪个月份来加载上个月的统计数据.
我还有一个时区感知的代码(现在不是很重要),并且接受strtotime兼容的字符串作为输入(初始化内部日期),然后允许调整日期/时间,也使用strtotime-compatible字符串.
我知道它可以通过几个条件和基本数学来完成,但与此相比,这是非常混乱的,例如(如果它正常工作,当然):
echo tz::date('last month')->format('Y-d')
Run Code Online (Sandbox Code Playgroud)
所以,我只需要一个月和一年,以一种strtotime兼容的方式.
回答(谢谢,@ ndagirl):
// Today is 2011-03-30
echo date('Y-m-d', strtotime('first day of last month')); // Output: 2011-02-01
Run Code Online (Sandbox Code Playgroud)
dna*_*irl 48
看看DateTime课程.它应该正确地进行计算并且日期格式兼容strttotime.就像是:
$datestring='2011-03-30 first day of last month';
$dt=date_create($datestring);
echo $dt->format('Y-m'); //2011-02
Run Code Online (Sandbox Code Playgroud)
ITr*_*ubs 28
如果这一天本身无关紧要这样做:
echo date('Y-m-d', strtotime(date('Y-m')." -1 month"));
Run Code Online (Sandbox Code Playgroud)
Sea*_*ney 23
我找到了答案,因为我今天遇到了同样的问题,这是第31个问题.这不是某些人会建议的PHP中的错误,而是预期的功能(在某些情况下).根据这篇文章,strtotime实际上做的是将月份设置为1,并且不会修改天数.因此,如果今天是5月31日,它正在寻找4月31日,这是一个无效的日期.所以它需要在4月30日之后再增加1天并收益于5月1日.
在您的示例2011-03-30中,它将在一个月后返回到2月30日,这是无效的,因为2月只有28天.然后它会在那些日子(30-28 = 2)之间产生差异,然后在2月28日(即3月2日)之后移动两天.
正如其他人所指出的,获得"上个月"的最佳方法是使用strtotime或DateTime对象添加"first day of"或"last day of":
// Today being 2012-05-31
//All the following return 2012-04-30
echo date('Y-m-d', strtotime("last day of -1 month"));
echo date('Y-m-d', strtotime("last day of last month"));
echo date_create("last day of -1 month")->format('Y-m-d');
// All the following return 2012-04-01
echo date('Y-m-d', strtotime("first day of -1 month"));
echo date('Y-m-d', strtotime("first day of last month"));
echo date_create("first day of -1 month")->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)
因此,使用这些可以创建日期范围,如果您进行查询等.
如果您希望上一年和每月相对于特定日期并且有DateTime可用,那么您可以这样做:
$d = new DateTime('2013-01-01', new DateTimeZone('UTC'));
$d->modify('first day of previous month');
$year = $d->format('Y'); //2012
$month = $d->format('m'); //12
Run Code Online (Sandbox Code Playgroud)
strtotime有第二个timestamp参数使第一个参数相对于第二个参数.所以你可以这样做:
date('Y-m', strtotime('-1 month', time()))
Run Code Online (Sandbox Code Playgroud)
如果我正确地理解了这个问题,你只需要上个月和它所在的年份:
<?php
$month = date('m');
$year = date('Y');
$last_month = $month-1%12;
echo ($last_month==0?($year-1):$year)."-".($last_month==0?'12':$last_month);
?>
Run Code Online (Sandbox Code Playgroud)
这是一个例子:http://codepad.org/c99nVKG8
呃,这不是一个人提到的错误。这是预期的行为,因为一个月中的天数通常不同。使用 strtotime 获取上个月的最简单方法可能是使用从本月第一天开始的 -1 个月。
$date_string = date('Y-m', strtotime('-1 month', strtotime(date('Y-m-01'))));
Run Code Online (Sandbox Code Playgroud)