Pierwszy dzień bieżącego miesiąca w php przy użyciu date_modify jako obiektu DateTime


157

Mogę dostać poniedziałek tego tygodnia z:

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

Z taką samą łatwością chciałbym uzyskać pierwszy dzień tego miesiąca. Jak mogę to osiągnąć?


Uh, mam kłopoty, John Conde odpowiedział na pytanie, na które odpowiedziałem, ale zapomniałem wspomnieć, że musi działać na 5.2, więc faktycznie skorzystam z odpowiedzi Mr-sk ...
pihentagy

Odpowiedzi:


260

Wymaga PHP 5.3 do działania („pierwszy dzień” jest wprowadzony w PHP 5.3). W przeciwnym razie powyższy przykład jest jedynym sposobem, aby to zrobić:

<?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');

W PHP 5.4+ możesz to zrobić:

<?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');

Jeśli wolisz zwięzły sposób, aby to zrobić i masz już rok i miesiąc w wartościach liczbowych, możesz uż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
Pamiętaj, że nie musisz przez nie przechodzić, ->modify()jeśli chcesz tylko pierwszego dnia bieżącego miesiąca . Można przekazać 'first day of this month'do konstruktora DateTime bezpośrednio jak: $date = new DateTime('first day of this month'). Tylko mówię ...
Dzhuneyt

334

Oto czego używam.

Pierwszy dzień miesiąca:

date('Y-m-01');

Ostatni dzień miesiąca:

date('Y-m-t');

10
Jest to zdecydowanie najprostszy i najbardziej czytelny sposób rozwiązania tego problemu według IMO, jeśli wszystko, czego potrzebujesz, to ciąg znaków reprezentujący datę.
Markus Amalthea Magnuson

5
Ostatni dzień miesiąca można było wtedy złapać za pomocą date('Y-m-t');.
Mark Tomlin

7
FYI: „t” in date („Ym-t”) zawsze reprezentuje liczbę dni w tym samym miesiącu. Świetny i prosty sposób na sprawdzenie ostatniego dnia bieżącego miesiąca.
Pascal Klein,

1
Jeśli użyję tego, aby spróbować uzyskać dzień tygodnia date('w', '2015-05-01');, skończy się dzień wcześniej, a nie faktyczny. (To dałoby mi 4 zamiast prawidłowej 5).
PBwebD

5
To jest po prostu genialne. Rozwinąłem to trochę, aby podać minimalne i maksymalne granice czasu w miesiącu, wykonując: $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
H2ONOCK

32

To wszystko, czego potrzebujesz:

$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
Jest to zgrabne rozwiązanie, jednak strtotime('first day of this month', time())wróci pierwszego dnia, a czas jest taki sam jak aktualny. Więc nie jest to pierwszy dzień o godzinie 0:00, jego pierwszy dzień i tak jak teraz. To rozwiązuje problem strtotime('first day of this month 00:00:00', time()).
Kalle H. Väravas

22

Obecnie używam tego rozwiązania:

$firstDay = new \DateTime('first day of this month');
$lastDay = new \DateTime('last day of this month');

Jedyny problem, na jaki się natknąłem, to ten dziwny czas. Potrzebowałem odpowiedniego zakresu dla naszego interfejsu wyszukiwania i skończyło się na tym:

$firstDay = new \DateTime('first day of this month 00:00:00');
$lastDay = new \DateTime('first day of next month 00:00:00');

To jest fajne, ale mam pewne problemy pierwszego dnia miesiąca. Tak więc, jeśli dzisiaj jest 1 września, godzina 11:00. Dostanę 1 sierpnia! Muszę sprawdzić, czy dzisiaj jest to „1”, a jeśli tak, użyj „teraz”. dziwne (Php 7.3.9)
Jacob Christensen

@JacobChristensen jeszcze tego nie doświadczył. Jak to naprawiłeś?
Nikola Petkanski

To prawda, php wydaje się nie być zbyt fajnym w tej pierwszej i ostatniej. $ n = nowy \ DateTime ('pierwszy dzień'. (nowy \ DateTime ()) -> format ('F')); „pierwszy dzień stycznia”. To samo dzieje się w tygodniu, kiedy jest poniedziałek i jest to trochę ... frustrujące :)
Jacob Christensen

20

Używam szalonego sposobu, aby to zrobić, używając tego polecenia

$firstDay=date('Y-m-d',strtotime("first day of this month"));
$lastDay=date('Y-m-d',strtotime("last day of this month"));

To wszystko


6

W php 5.2 możesz użyć:

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

4

Ugly (i nie używa powyższego wywołania metody), ale działa:

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

poza tematem, ale jak obliczyłbyś ostatni dzień miesiąca przy tym samym scenariuszu.
LoneWOLFs

@LoneWOLFs last day of {$month} {$year}lub last day of this monthoba działają. Należy jednak pamiętać, że $ miesiąc musiałby być ciągiem znaków zawierającym nazwę miesiąca, np. „Styczeń”, łącznie z nazwą „grudzień”. Lub możesz po prostu użyć date('Y-m-t');.
Mark Tomlin

3

Możesz to zrobić w ten sposób:

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

3

Używam tego do codziennej pracy cron, aby sprawdzić, czy powinienem wysłać wiadomość e-mail pierwszego dnia dowolnego miesiąca do moich partnerów. To o kilka linii więcej niż inne odpowiedzi, ale solidne jak skała.

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

używając metody daty powinniśmy być w stanie otrzymać wynik. to znaczy; data ('N / D / l', mktime (0, 0, 0, miesiąc, dzień, rok));

Na przykład

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

Wszystkie te specjalne wyrażenia php, w duchu, first day of ...są świetne, chociaż raz po raz wychodzą mi z głowy.

Postanowiłem więc zbudować kilka podstawowych abstrakcji datetime i mnóstwo konkretnych implementacji, które są automatycznie uzupełniane przez dowolne IDE. Chodzi o to, aby znaleźć, jakie rzeczy. Podobnie jak, today, now, the first day of a previous month, itd. Wszystkie te rzeczy, które wymienione datetimes. W związku z tym istnieje wywoływany interfejs lub klasa abstrakcyjna ISO8601DateTimeoraz określone czasy danych, które ją implementują.

Kod w twoim konkretnym przypadku wygląda tak:

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

Więcej informacji na temat tego podejścia znajdziesz w tym wpisie .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.