【发布时间】:2009-11-22 00:59:48
【问题描述】:
我怎样才能找到下个月的第一天以及从今天到今天的剩余天数?
谢谢
【问题讨论】:
标签: php
我怎样才能找到下个月的第一天以及从今天到今天的剩余天数?
谢谢
【问题讨论】:
标签: php
为下个月的第一天 00:00 创建一个时间戳:
$firstDayNextMonth = strtotime('first day of next month');
距离该日期的天数是从现在到那时的秒数除以 (24 * 60 * 60)。
$daysTilNextMonth = ($firstDayNextMonth - time()) / (24 * 3600);
【讨论】:
$startDateRange = mktime(0, 0, 0, 1, 1, $curYear+1);
获取本月最后一天的最简单方法
date('Y-m-d', mktime(0, 0, 0, date('m')+1, 1, date('Y')));
【讨论】:
$firstDayNextMonth = date('Y-m-d', strtotime('first day of next month'));
从当前开始两个月后的第一天
$firstDayAfterTwoMonths = date('Y-m-d', strtotime('first day of +2 month'));
【讨论】:
strtotime('first day of +2 month')
您可以像这样使用 DateTime 对象来找出下个月的第一天,如下所示:
$date = new DateTime('first day of next month');
您可以这样做来知道从现在到下个月的第一天还有多少天:
$date = new DateTime('now');
$nowTimestamp = $date->getTimestamp();
$date->modify('first day of next month');
$firstDayOfNextMonthTimestamp = $date->getTimestamp();
echo ($firstDayOfNextMonthTimestamp - $nowTimestamp) / 86400;
【讨论】:
您可以使用 php date 方法查找当前月份和日期,然后您需要有一个简短的列表来查找该月有多少天并减去(闰年需要额外的工作)。
【讨论】:
最简单快捷的方法是使用 strtotime() 识别“下个月第一天”;
$firstDayNextMonth = date('Y-m-d', strtotime('first day next month'));
【讨论】:
2012-11-30)结果为2012-12-31。像这样实现它可能更安全:$firstDayNextMonth = date('Y-m-01', strtotime('next month'));
'first day next month' 时就会发生这种情况。应该是'first day of next month',一切都会按预期进行。
strtotime('first day of +2 month')
自从我用谷歌搜索了这个并得出了这个答案,我想我会包含一个适用于 PHP 5.3.0+ 的更现代的答案。
//Your starting date as DateTime
$currentDate = new DateTime(date('Y-m-d'));
//Add 1 month
$currentDate->add(new DateInterval('P1M'));
//Get the first day of the next month as string
$firstDayOfNextMonth = $currentDate->format('Y-m-1');
【讨论】:
您可以通过以下方式获得下个月的第一天:
$now = getdate();
$nextmonth = ($now['mon'] + 1) % 13 + 1;
$year = $now['year'];
if($nextmonth == 1)
$year++;
$thefirst = gmmktime(0, 0, 0, $nextmonth, $year);
在此示例中,$thefirst 将是下个月第一天的 UNIX 时间戳。使用date 将其格式化为您喜欢的格式。
这将为您提供该月的剩余天数:
$now = getdate();
$months = array(
31,
28 + ($now['year'] % 4 == 0 ? 1 : 0), // Support for leap years!
31,
30,
31,
30,
31,
31,
30,
31,
30,
31
);
$days = $months[$now['mon'] - 1];
$daysleft = $days - $now['mday'];
剩余天数将存储在$daysleft。
希望这会有所帮助!
【讨论】:
$firstDayNextMonth = date('Y-m-d', mktime(0, 0, 0, date('m')+1, 1, date('Y')));
【讨论】:
正如另一位发帖人所提到的,当您使用 2016 年 1 月 31 日或 2016 年 8 月 31 日等日期时,DateInterval 对象不会给出下个月的准确结果,因为它会跳过下个月。我的解决方案是仍然使用 DateInterval 对象,但在使用 DateInterval 之前将当前日期重新格式化为当月的第一天。
$currentDate = '8/31/2016';
$date = new DateTime(date("n", strtotime($currentDate))."/1/".date("Y", strtotime($currentDate)));
//add 1 month
$date->add(new DateInterval('P1M'));
$currentDate=$date->format('m/1/Y');
echo($currentDate);
【讨论】:
我采用了 mattbasta 的方法,因为它能够获得具有给定日期的“下个月的第一天”,但是在计算 $nextmonth 时存在一个小问题。修复方法如下:
$now = getdate();
$nextmonth = ($now['mon'] + 1) % 13 + 1;
$year = $now['year'];
if($nextmonth == 1)
$year++;
else
$nextmonth--;
$thefirst = gmmktime(0, 0, 0, $nextmonth, $year);
【讨论】:
我最初考虑使用 DateInterval 对象(如上文在另一个答案中所讨论的),但它不可靠。例如,如果当前 DateTime 是 1 月 31 日,然后我们添加一个月(以获得下个月),那么它将完全跳过 2 月!
这是我的解决方案:
function start_of_next_month(DateTime $datetime)
{
$year = (int) $datetime->format('Y');
$month = (int) $datetime->format('n');
$month += 1;
if ($month === 13)
{
$month = 1;
$year += 1;
}
return new DateTime($year . '-' . $month . '-01');
}
【讨论】:
获取下个月第一天和最后一天的更简单方法
$first = strttotime("first day of next month");
$last = strttotime("last day of next month");
【讨论】:
你可以做这样的事情。要拥有此功能,您需要使用https://packagist.org/packages/ishworkh/navigable-date 中提供的 php 库。
这样就可以很容易地完成您在这里的要求。 例如:
$format = 'Y-m-d H:i:s';
$Date = \NavigableDate\NavigableDateFacade::create('2017-02-24');
var_dump($Date->format($format));
$resetTime = true;
$resetDays = true;
$NextMonth = $Date->nextMonth($resetTime, $resetDays);
var_dump($NextMonth->format($format));
$DayUntilFirstOfNextMonth = $NextMonth->getDifference($Date);
var_dump('Days left:' . $DayUntilFirstOfNextMonth->format('%d'));
给你输出:
string(19) "2017-02-24 00:00:00"
string(19) "2017-03-01 00:00:00"
string(11) "Days left:5"
注意:此外,此库允许您按天、周、年向前或向后导航日期。有关更多信息,请查看其 README。
【讨论】:
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
为了得到下个月的第一天一个干净的解决方案:
<?php
$date = new DateTimeInmutable('now');
$date->modify('first day of next month');//here the magic occurs
echo $date->format('Y-m-d') . '\n';
由于您只想计算它,我建议使用DateTimeInmutable 类。
使用 DateTime 和 $date->modify('first day of next month'); 类将修改您的原始日期值。
【讨论】:
DateTimeInmutable。此外,它是不可变的,这意味着您需要将修改分配给第二个变量,因为原始的 $date 变量不会被更改。
$month = date('m')+1;
if ($month<10) {
$month = '0'.$month;
}
echo date('Y-').$month.'-01';
实现这一目标的最简单方法。您可以回显或存储到变量中。
【讨论】:
12 年后,在阅读了答案后,我想出了这个来满足我的需要:
if(date('m') == 12) { $next_month = 1; } else { $next_month = date('m')+1; }
if($next_month == 1) { $year_start = date('Y')+1; } else { $year_start = date('Y'); }
$date_start_of_next_month = $year_start . '-' . $next_month . '-01 00:00:00';
if($next_month == 12) { $month_after = 1; } else { $month_after = $next_month+1; }
if($month_after == 1) { $year_end = date('Y')+1; } else { $year_end = date('Y'); }
$date_start_of_month_after_next = $year_end . '-' . $month_after . '-01 00:00:00';
请注意,我没有选择$date_end_of_next_month,而是选择了$date_start_of_month_after_next 日期,它避免了闰年和包含不同天数的月份的麻烦。
您可以简单地使用>= 比较符号$date_start_of_next_month 和< 一个$date_start_of_month_after_next。
如果您更喜欢日期的时间戳格式,那么您需要在这两个变量上应用 PHP 的 strtotime() 本机函数。
希望现在帮助您满足需求还为时不晚。 #开玩笑
【讨论】: