php中使用date_modify作为DateTime对象的当月第一天


157

我可以通过以下方式获得本周的星期一:

$monday = date_create()->modify('this Monday');

我想在本月1日得到同样的放心。我该如何实现?


呃,我很麻烦,约翰·康德(John Conde)回答了我回答的问题,但我忘了提一下,它需要在5.2上运行,所以我实际上将使用Mr-sk的回答……
pihentagy 2010年

Answers:


260

需要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

9
请注意,->modify()如果您只想要当前月份的第一天,则不必进行检查。您可以'first day of this month'直接传递给DateTime构造函数,例如:$date = new DateTime('first day of this month')。只是说...
Dzhuneyt 2015年

333

这是我用的。

一个月的第一天:

date('Y-m-01');

一个月的最后一天:

date('Y-m-t');

10
如果您只需要日期的字符串表示形式,这是迄今为止IMO最简单,最易读的解决方法。
Markus Amalthea Magnuson,2012年

5
然后可以使用来捕获该月的最后一天date('Y-m-t');
Mark Tomlin 2013年

7
仅供参考:日期中的't'(Ym-t')始终代表该月的天数。一种获取当前月最后一天的好方法。
Pascal Klein

1
如果我使用它来获取星期几,date('w', '2015-05-01');那么我将以前一天而不是实际的日期结束。(这将给我4而不是正确的5)。
PBwebD

5
这简直太棒了。我在此基础上进行了一些扩展,通过执行以下操作来给出月份中时间的最小和最大界限: $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
H2ONOCK 2015年

32

这就是您需要的一切:

$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/>';

4
这是一个很好的解决方案,但是strtotime('first day of this month', time())会在第一天返回,并且时间与当前时间相同。因此,它的第一天不是现在的第一天,而是现在的时间。这样就解决了strtotime('first day of this month 00:00:00', time())
Kalle H.Väravas2014年

22

目前,我正在使用以下解决方案:

$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')); “一月一日”。本周的星期一也是如此,这有点...令人沮丧:)
Jacob Christensen


6

在php 5.2中,您可以使用:

<? $d = date_create();
print date_create($d->format('Y-m-1'))->format('Y-m-d') ?>

4

丑陋的(并且不使用上面的方法调用),但是可以工作:

echo 'First day of the month: ' . date('m/d/y h:i a',(strtotime('this month',strtotime(date('m/01/y')))));   

超出主题,但在相同情况下如何计算每月的最后一天。
LoneWOLFs 2012年

@LoneWOLF last day of {$month} {$year}last day of this month两者都起作用。但是请记住,$ month必须是一个字符串,其中包含一直到“ Decemember”的月份名称,例如“ January”。或者您可以简单地使用date('Y-m-t');
Mark Tomlin 2013年

3

您可以这样做:

$firstday = date_create()->modify('first day January 2010');

3

我将其与日常计划工作一起使用,以检查是否应在给定月份的第一天向我的会员发送电子邮件。比其他答案多了几行,但坚如磐石。

//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;

}

2

使用date方法,我们应该能够得到结果。即 date('N / D / l',mktime(0,0,0,month,day,year));

例如

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

0

所有那些特殊的php表达式,first day of ...尽管它们一次又一次地超出了我的头脑,但它们的精神还是很棒的。

因此,我决定构建一些基本的日期时间抽象和大量的特定实现,这些抽象可以由任何IDE自动完成。关键是要找到什么样的东西。就像,todaynowthe first day of a previous month,等所有的我列出的那些东西日期时间。因此,存在一个称为的接口或抽象类ISO8601DateTime,以及实现它的特定日期时间。

您特定情况下的代码如下所示:

(new TheFirstDayOfThisMonth(new Now()))->value();

有关此方法的更多信息,请查看此条目

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.