php 中当月的第一天使用 date_modify 作为 DateTime 对象
Posted
技术标签:
【中文标题】php 中当月的第一天使用 date_modify 作为 DateTime 对象【英文标题】:The first day of the current month in php using date_modify as DateTime object 【发布时间】:2011-01-06 21:04:33 【问题描述】:我可以通过以下方式获得本周的星期一:
$monday = date_create()->modify('this Monday');
我想在本月 1 日也能轻松获得。我怎样才能做到这一点?
【问题讨论】:
呃,我遇到了麻烦,John Conde 回答了我回答的问题,但我忘了提,它需要在 5.2 上工作,所以我实际上会使用 Mr-sk 的答案...... 【参考方案1】:丑陋,(并且不使用上面的方法调用)但有效:
echo 'First day of the month: ' . date('m/d/y h:i a',(strtotime('this month',strtotime(date('m/01/y')))));
【讨论】:
题外话,但在同样的情况下,你将如何计算当月的最后一天。 @LoneWOLFslast day of $month $year
或 last day of this month
都可以。但请记住,$month 必须是一个包含月份名称的字符串,例如“January”一直到“Decemember”。或者你可以简单地使用date('Y-m-t');
。
“欺骗”:D【参考方案2】:
需要 php 5.3 才能工作(“第一天”在 PHP 5.3 中引入)。否则上面的例子是唯一的方法:
<?php
// First day of this month
$d = new DateTime('first day of this month');
echo $d->format('jS, F Y');
// First day of a specific month
$d = new DateTime('2010-01-19');
$d->modify('first day of this month');
echo $d->format('jS, F Y');
// alternatively...
echo date_create('2010-01-19')
->modify('first day of this month')
->format('jS, F Y');
在 PHP 5.4+ 中你可以这样做:
<?php
// First day of this month
echo (new DateTime('first day of this month'))->format('jS, F Y');
echo (new DateTime('2010-01-19'))
->modify('first day of this month')
->format('jS, F Y');
如果您更喜欢简洁的方式,并且已经有年份和月份的数值,您可以使用date()
:
<?php
echo date('Y-m-01'); // first day of this month
echo date("$year-$month-01"); // first day of a month chosen by you
【讨论】:
请注意,如果您只需要当前月份的第一天,则不必通过->modify()
。您可以将'first day of this month'
直接传递给 DateTime 构造函数,例如:$date = new DateTime('first day of this month')
。只是说...【参考方案3】:
你可以这样做:
$firstday = date_create()->modify('first day January 2010');
【讨论】:
【参考方案4】:在 php 5.2 中你可以使用:
<? $d = date_create();
print date_create($d->format('Y-m-1'))->format('Y-m-d') ?>
【讨论】:
【参考方案5】:这是我使用的。
每月的第一天:
date('Y-m-01');
当月的最后一天:
date('Y-m-t');
【讨论】:
如果您只需要日期的字符串表示形式,这是 IMO 迄今为止解决此问题的最简单和最易读的方法。 然后可以使用date('Y-m-t');
抓取该月的最后一天。
仅供参考:date('Y-m-t') 中的 't' 始终表示该月的天数。获取当月最后一天的绝佳而简单的方法。
如果我使用它来尝试获取星期几date('w', '2015-05-01');
,那么我会得到前一天而不是实际日期。 (这会给我 4 而不是正确的 5)。
这简直太棒了。我通过以下方式对其进行了扩展,以给出该月时间的最小和最大界限:$monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
【参考方案6】:
目前我正在使用这个解决方案:
$firstDay = new \DateTime('first day of this month');
$lastDay = new \DateTime('last day of this month');
我遇到的唯一问题是设定了奇怪的时间。我需要为我们的搜索界面提供正确的范围,我最终得到了这个:
$firstDay = new \DateTime('first day of this month 00:00:00');
$lastDay = new \DateTime('first day of next month 00:00:00');
【讨论】:
这很酷,但我在实际的每月第一天遇到了一些问题。所以,如果今天是 9 月 1 日,上午 11 点。我会在 8 月 1 日收到!我需要实际检查它是否是今天的“第一个”,如果是,请使用“现在”。奇怪(PHP 7.3.9) @JacobChristensen 还没有经历过。你是怎么解决的? 非常正确,php 接缝对于这个第一个和最后一个并不是很酷。 $n = new \DateTime('第一天' . (new \DateTime())->format('F')); “一月的第一天”。本周星期一也会发生同样的情况,这有点......令人沮丧:)【参考方案7】:这就是你需要的一切:
$week_start = strtotime('last Sunday', time());
$week_end = strtotime('next Sunday', time());
$month_start = strtotime('first day of this month', time());
$month_end = strtotime('last day of this month', time());
$year_start = strtotime('first day of January', time());
$year_end = strtotime('last day of December', time());
echo date('D, M jS Y', $week_start).'<br/>';
echo date('D, M jS Y', $week_end).'<br/>';
echo date('D, M jS Y', $month_start).'<br/>';
echo date('D, M jS Y', $month_end).'<br/>';
echo date('D, M jS Y', $year_start).'<br/>';
echo date('D, M jS Y', $year_end).'<br/>';
【讨论】:
这是一个简洁的解决方案,但是strtotime('first day of this month', time())
将返回第一天,并且时间与当前时间相同。因此,它不是第一天 0:00 点,它的第一天和现在的时间一样。这修复了它strtotime('first day of this month 00:00:00', time())
。【参考方案8】:
我用一种疯狂的方式来做到这一点,就是使用这个命令
$firstDay=date('Y-m-d',strtotime("first day of this month"));
$lastDay=date('Y-m-d',strtotime("last day of this month"));
就是这样
【讨论】:
您需要在第一部分粘贴 strtotime("today") 以确保时间从 00:00:00 开始,否则您会得到现在的时间作为第一天的时间这个月。请参阅我的答案,但在短时间内 date("Ymd",strtotime("first day of this month",strtotime("today")); 那么最后一天需要是您所做的,但使用 $firstDay 作为“NOW”然后减去 -1 秒【参考方案9】:使用日期方法,我们应该可以得到结果。 IE; date('N/D/l', mktime(0, 0, 0, 月, 日, 年));
举例
echo date('N', mktime(0, 0, 0, 7, 1, 2017)); // will return 6
echo date('D', mktime(0, 0, 0, 7, 1, 2017)); // will return Sat
echo date('l', mktime(0, 0, 0, 7, 1, 2017)); // will return Saturday
【讨论】:
【参考方案10】:我将它与每日 cron 作业一起使用,以检查我是否应该在任何给定月份的第一天向我的附属公司发送电子邮件。它比其他答案多几行,但坚如磐石。
//is this the first day of the month?
$date = date('Y-m-d');
$pieces = explode("-", $date);
$day = $pieces[2];
//if it's not the first day then stop
if($day != "01")
echo "error - it's not the first of the month today";
exit;
【讨论】:
我不敢相信你根本没有使用$day = $date('d');
(!) 而不是前 3 行
@dev_masta 是的,这是真的。谢谢你的提示。我可能会做 if($date('d') != 01) 让它更短。【参考方案11】:
所有这些特殊的 php 表达式,本着first day of ...
的精神,都很棒,尽管它们一次又一次地从我的脑海中消失。
所以我决定构建一些基本的日期时间抽象和大量特定的实现,它们可以由任何 IDE 自动完成。关键是要找到 what 类的东西。比如,today
、now
、the first day of a previous month
等。我列出的所有这些内容都是日期时间。因此,有一个名为ISO8601DateTime
的接口或抽象类,以及实现它的特定日期时间。
您的特定情况下的代码如下所示:
(new TheFirstDayOfThisMonth(new Now()))->value();
有关此方法的更多信息,请查看this entry。
【讨论】:
【参考方案12】:本月初和本月最后一秒的时间戳。 您可以添加 00:00:00 或仅引用“今天”
替代方案:
$startOfThisMonth = strtotime("first day of this month",strtotime("today"));
OR
$startOfThisMonth = strtotime("first day of this month 00:00:00");
$endOfThisMonth = strtotime("first day of next month",$startOfThisMonth)-1;
【讨论】:
以上是关于php 中当月的第一天使用 date_modify 作为 DateTime 对象的主要内容,如果未能解决你的问题,请参考以下文章
java获取当月的第一天和最后一天,获取本周的第一天和最后一天