【发布时间】:2010-09-07 19:11:52
【问题描述】:
我需要以 YYYY-MM-DD 格式获取一个月的第一天和最后一天,仅给出月份和年份。有没有一种好的、简单的方法来做到这一点?
【问题讨论】:
-
我觉得要求一个月的第一天有点愚蠢....:\
标签: php
我需要以 YYYY-MM-DD 格式获取一个月的第一天和最后一天,仅给出月份和年份。有没有一种好的、简单的方法来做到这一点?
【问题讨论】:
标签: php
第一天总是 YYYY-MM-01,不是吗?示例:date("Y-M-d", mktime(0, 0, 0, 8, 1, 2008))
最后一天是下个月第一天的前一天:
$date = new DateTime("2008-09-01");
$date->modify("-1 day");
echo $date->format("Y-m-d");
【讨论】:
每月的第一天总是 1。 所以会变成
YYYY-MM-01
最后一天可以计算为:
<?php
$num = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
echo "There was $num days in August 2003";
?>
【讨论】:
$first = date('Y-m-d', mktime(0, 0, 0, $month, 1, $year));
$last = date('Y-m-t', mktime(0, 0, 0, $month, 1, $year));
请参阅 PHP 文档中的 date()。
【讨论】:
好的,首先很容易。
date ('Y-m-d', mktime(0,0,0,MM,01,YYYY));
最后一个有点棘手,但不多。
date ('Y-m-d', mktime(0,0,0,MM + 1,-1,YYYY));
如果我没记错我的 PHP 日期...
**编辑 - 啊!被它打败了大约一百万次......
Pat 编辑:
应该是最后一天
date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1
【讨论】:
顺便@ZombieSheep解决方案
date ('Y-m-d', mktime(0,0,0,$MM + 1,-1,$YYYY));
应该是不行的
date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1
当然,@Michał Słaby 接受的解决方案是最简单的。
【讨论】:
只是为了验证我没有遗漏任何内容:
$startDay = 1;
if (date("m") == 1) {
$startMonth = 12;
$startYear = date("Y") - 1;
$endMonth = 12;
$endYear = date("Y") - 1;
}
else {
$startMonth = date("m") - 1;
$startYear = date("Y");
$endMonth = date("m") - 1;
$endYear = date("Y");
}
$endDay = date("d") - 1;
$startDate = date('Y-m-d', mktime(0, 0, 0, $startMonth , $startDay, $startYear));
$endDate = date('Y-m-d', mktime(0, 0, 0, $endMonth, $endDay, $endYear));
【讨论】:
<?php
echo "Month Start - " . $monthStart = date("Y-m-1") . "<br/>";
$num = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y"));
echo "Monthe End - " . $monthEnd = date("Y-m-".$num);
?>
【讨论】:
使用 PHP 最简单的方法是
$dateBegin = strtotime("first day of last month");
$dateEnd = strtotime("last day of last month");
echo date("MYDATEFORMAT", $dateBegin);
echo "<br>";
echo date("MYDATEFORMAT", $dateEnd);
或者上周
if (date('N', time()) == 7) {
$dateBegin = strtotime("-2 weeks Monday");
$dateEnd = strtotime("last Sunday");
} else {
$dateBegin = strtotime("Monday last week");
$dateEnd = strtotime("Sunday last week");
}
或者去年
$dateBegin = strtotime("1/1 last year");
$dateEnd = strtotime("12/31 this year");
【讨论】:
试试这个来得到这个月的天数:
$numdays = date('t', mktime(0, 0, 0, $m, 1, $Y));
【讨论】:
示例;我想得到当月的第一天和最后一天。
$month = (int) date('F');
$year = (int) date('Y');
date('Y-m-d', mktime(0, 0, 0, $month + 1, 1, $year)); //first
date('Y-m-d', mktime(0, 0, 0, $month + 2, 0, $year)); //last
例如在日期 2015-01-09 运行此命令时,第一个和最后一个值将按顺序排列;
2015-01-01
2015-01-31
经过测试。
【讨论】:
来自标记为重复的here(get next month last day),因此我无法在此处添加评论,但人们可能会从那里得到不好的答案。
下个月最后一天更正一个:
echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-t'));
下个月的第一天更正一个:
echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-01'));
这样的代码将从 1 月开始在 3 月提供,所以这不是预期的。
echo ((new DateTime())->modify('+1 month')->format('Y-m-t'));
【讨论】:
从现在开始建立相对日期的正确方法是:
//bad example - will be broken when generated at 30 of December (broken February)
echo date("Y-m-d", strtotime("now"))."\n";
echo date("Y-m-d", strtotime("now + 1 month"))."\n";
echo date("Y-m-d", strtotime("now + 2 month"))."\n";
echo date("Y-m-d", strtotime("now + 3 month"))."\n";
//good example, you can change first day to last day or any day
echo date("Y-m-d", strtotime("first day of this month"))."\n";
echo date("Y-m-d", strtotime("first day of next month"))."\n";
echo date("Y-m-d", strtotime("first day of +2 month"))."\n";
echo date("Y-m-d", strtotime("first day of +3 month"))."\n";
结果将是:
2021-12-30
2022-01-30
2022-03-02
2022-03-30
2021-12-01
2022-01-01
2022-02-01
2022-03-01
【讨论】: