首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用strtotime和date获取相对于今天的上一月和前一年?

如何使用strtotime和date获取相对于今天的上一月和前一年?
EN

Stack Overflow用户
提问于 2011-03-31 00:56:05
回答 14查看 154.3K关注 0票数 67

我需要得到之前的月份和年份,相对于当前日期。

但是,请参见以下示例。

代码语言:javascript
复制
// Today is 2011-03-30
echo date('Y-m-d', strtotime('last month'));

// Output:
2011-03-02

这种行为是可以理解的(在某种程度上),因为2月和3月的天数不同,上面例子中的代码是我需要的,但在每个月的1号和28号之间只能100%正确地工作。

那么,如何以最优雅的方式获取上个月和上一年(想想date("Y-m")),它适用于一年中的每一天?最佳解决方案将基于strtotime参数解析。

更新。为了更好地阐明需求。

我有一段代码可以获取过去几个月的统计数据,但我首先显示上个月的统计数据,然后在需要的时候加载其他月份的数据。这是预期的目的。因此,在这个月,我想找出我应该拉出哪个月-年,以便加载前一个月的统计数据。

我还有一个时区感知的代码(现在不是很重要),它接受strtotime-compatible字符串作为输入(初始化内部日期),然后允许调整日期/时间,也使用strtotime-compatible字符串。

我知道只需要几个条件和基本的数学就可以完成,但这真的很混乱,比方说(当然,如果它工作正常的话):

代码语言:javascript
复制
echo tz::date('last month')->format('Y-d')

因此,我只需要以前的月份和年份,以strtotime-compatible的方式。

回答(谢谢,@dnagirl):

代码语言:javascript
复制
// Today is 2011-03-30
echo date('Y-m-d', strtotime('first day of last month')); // Output: 2011-02-01
EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2011-03-31 01:35:41

看一下DateTime类。它应该正确地进行计算,并且日期格式与strttotime兼容。类似于:

代码语言:javascript
复制
$datestring='2011-03-30 first day of last month';
$dt=date_create($datestring);
echo $dt->format('Y-m'); //2011-02
票数 61
EN

Stack Overflow用户

发布于 2011-03-31 01:08:42

如果这一天本身无关紧要,那就这样做:

代码语言:javascript
复制
echo date('Y-m-d', strtotime(date('Y-m')." -1 month"));
票数 36
EN

Stack Overflow用户

发布于 2012-06-01 00:27:18

我找到了答案,因为我今天遇到了同样的问题,也就是31号。它不像一些人所说的那样是一个bug in php,但它是预期的功能(在某些情况下)。根据这个post,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”:

代码语言:javascript
复制
// 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');

所以如果你在做一个查询的话,可以使用它们来创建一个日期范围。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5489502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档