如何使用strtotime和日期获得相对于今天的上个月和年份?

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)

  • 该死的<其中有一个小错误:回音日期('Ym-d',strtotime(日期('Ym-1')." - 1月")); 这就是我的意思 (3认同)
  • 今天,这仍然是三月。我预计是二月。 (2认同)

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)

因此,使用这些可以创建日期范围,如果您进行查询等.


Tim*_*nen 9

如果您希望上一年和每月相对于特定日期并且有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)


Mar*_*rek 7

date('Y-m', strtotime('first day of last month'));
Run Code Online (Sandbox Code Playgroud)


die*_*end 6

strtotime有第二个timestamp参数使第一个参数相对于第二个参数.所以你可以这样做:

date('Y-m', strtotime('-1 month', time()))
Run Code Online (Sandbox Code Playgroud)


Nea*_*eal 5

如果我正确地理解了这个问题,你只需要上个月和它所在的年份:

<?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


dqh*_*cks 5

呃,这不是一个人提到的错误。这是预期的行为,因为一个月中的天数通常不同。使用 strtotime 获取上个月的最简单方法可能是使用从本月第一天开始的 -1 个月。

$date_string = date('Y-m', strtotime('-1 month', strtotime(date('Y-m-01'))));
Run Code Online (Sandbox Code Playgroud)