我需要以"Ymd"格式声明两个日期:$toDate和$fromDate.
$toDate代表今天的日期,$fromDate需要比今天早4个月.
$toDate = Date('Ymd');
$fromDate = ?
Run Code Online (Sandbox Code Playgroud)
我该如何创作$fromDate?
可能重复:
PHP DateTime ::修改添加和减去月份
我有一个开始日期(即2011-01-30),并希望增加1个月.
问题在于定义一个月是什么.所以,如果我使用以下代码:
$d1 = DateTime::createFromFormat('Y-m-d H:i:s', '2011-01-30 15:57:57');
$d1->add(new DateInterval('P1M'));
echo $d1->format('Y-m-d H:i:s');
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:2011-03-02 15:57:57
问题是,我需要它使用以下规则:
在PHP中有一个常见的功能可以做到这一点,还是我必须自己编写代码?也许我只是缺少一个参数或什么!?
我想从约会中减去1个月.
$today = date('m-Y');
Run Code Online (Sandbox Code Playgroud)
这给出了:08-2016
我怎样才能减去一个月才能得到07-2016?
我知道PHP函数的不良行为
的strtotime
例如,将日期(+1个月)添加到日期,例如:31.01.2011 - > 03.03.2011
我知道这不是正式的PHP错误,并且这个解决方案背后有一些论据,但至少对我来说,这种行为造成了很多浪费时间(在过去和现在),我个人讨厌它.
我发现甚至更奇怪的是,例如:
MySQL: DATE_ADD('2011-01-31',INTERVAL 1 MONTH)返回2011-02-28或
C# where new DateTime(2011,01,31).AddMonths(1); 将于28.02.2011返回
wolframalpha.com给予31.01.2013 + 1 month作为输入; 将于2013年2月28日星期四返回
它向我看到其他人已经找到了一个更好的解决方案,我在PHP错误报告中看到了很多愚蠢的问题,"如果我说我们会在一个月后见面会是什么日子"或类似的东西.答案是:如果下个月不存在31,请告诉我那个月的最后一天,但请坚持下个月.
所以我的问题是:是否有一个PHP函数(由某人编写)解决了这个没有官方认可的错误?因为我不认为我是唯一一个在添加/减去月份时想要另一种行为的人.
我特别感兴趣的是解决方案,它不仅适用于本月底,而且完全取代了strtotime.此外,strotime +n months还应处理此案.
快乐的编码!
我写了这段代码,以显示当前日期+ 2个月:
<?php
$date = date("d/m/Y");
$date = strtotime(date("d/m/Y", strtotime($date)) . "+2 months");
$date = date("d/m/Y",$date);
echo $date;
?>
Run Code Online (Sandbox Code Playgroud)
它似乎不起作用,因为它显示:01/03/1970.
我究竟做错了什么?
谢谢你的帮助.
编辑:
在阅读了评论和答案之后,我对其进行了简化和纠正.
<?php
$date = date("d/m/Y", strtotime(" +2 months"));
echo $date;
?>
Run Code Online (Sandbox Code Playgroud) 昨天我遇到了PHP的strtotime问题没有正确添加一个月.在'2011-05-31'我跑了:
date('Y-m-d',strtotime( '+1 month', strtotime('now')));
Run Code Online (Sandbox Code Playgroud)
当我期待'2011-06-30'时,返回'2011-07-01'.
MySQL没有任何问题.
我宁愿不用这个重新发明轮子,因为根据我的经验,用日期计算很容易犯错误.
有没有人为PHP 5.1提供可靠且经过测试的解决方案?
如果我使用这段代码,我会得到奇怪的结果:
$datetime = new DateTime('2015-01-31');
$datetime->modify('+1 month');
echo $datetime->format('Y-m-t') . "<br>";
$datetime->modify('+1 month');
echo $datetime->format('Y-m-t') . "<br>";
$datetime->modify('+1 month');
echo $datetime->format('Y-m-t') . "<br>";
Run Code Online (Sandbox Code Playgroud)
我明白了:
2015-03-31
2015-04-30
2015-05-31
Run Code Online (Sandbox Code Playgroud)
而不是2015-02-28.
怎么修?
我在Kubuntu 14.04中使用LAMP,PHP 5.6.23.
在以下情况下使用DateTime时:
1.
print_r((new DateTime('2016-02-31'))->format('M/d/Y'));
// Mar/02/2016 (no errors, why?)
Run Code Online (Sandbox Code Playgroud)
2.
print_r((new DateTime('2016-02-32'))->format('M/d/Y'));
// Error - DateTime::__construct(): Failed to parse time string-
// (2016-02-32) at position 9 (2): Unexpected character
Run Code Online (Sandbox Code Playgroud)
为什么第一个案例没有给我错误,因为没有第二个月的第31个月?
要求提供支持答复的参考文献
我已经看到以前在现有日期增加两个月的问题,但现有的答案对我没有多大帮助,因为我得到的结果与我想要的不同.我已经设置了如下日期:
$date = "2014-12-31";
$date = date('Y-m-d', strtotime("$date +2 month"));
Run Code Online (Sandbox Code Playgroud)
在我添加2个月后,我将其打印出来:
echo $date;
Run Code Online (Sandbox Code Playgroud)
我的结果:
2015年3月3日
但这对我来说是不对的,因为这是我想要的整整一个月:
2015年2月28日
我怎样才能做到这一点?
我已经看过这个答案了,它与我所拥有的非常接近。
这是我的PHP代码:
$start = new DateTime('0:00 first day of previous month', new DateTimeZone('UTC'));
/*
if (isset($_GET['year']) && isset($_GET['month']) && checkdate($_GET['month'], 1, $_GET['year'])) {
$start = DateTime::createFromFormat('Y-m-d', $_GET['year'] . '-' . $_GET['month'] . '-1');
}*/
$middle = DateTime::createFromFormat('U', strtotime('first day of last month', $start->format('U')));
$middle->setTimezone(new DateTimeZone('UTC'));
$end = DateTime::createFromFormat('U', strtotime('first day of 2 months ago', $start->format('U')));
$end->setTimezone(new DateTimeZone('UTC'));
var_dump($start);
var_dump($middle);
var_dump($end);
Run Code Online (Sandbox Code Playgroud)
今天是 8 月 27 日,所以我预计是 7 月 1 日、6 月 1 日和 5 月 1 日。以下是实际输出:
object(DateTime)[1]
public …Run Code Online (Sandbox Code Playgroud)