Pobieranie daty z ostatniego miesiąca w php

84

Chcę poznać datę z ostatniego miesiąca. Napisałem to:

$prevmonth = date('M Y');

Co daje mi bieżący miesiąc / rok. Nie mogę powiedzieć, czy powinno się używać strtotime, mktime. Coś do sygnatury czasowej? Czy muszę później coś dodać, aby zresetować, tak aby data nie była ustawiona na ostatni miesiąc we wszystkim dla wszystkich sygnatur czasowych w mojej witrynie? Próbuję RTM, ale ciężko mi to rozgryźć.

str.
źródło

Odpowiedzi:

208

Uzyskanie daty z ostatniego miesiąca jest proste

echo date("Y-n-j", strtotime("first day of previous month"));
echo date("Y-n-j", strtotime("last day of previous month"));

3 listopada powraca

2014-10-1
2014-10-31
OzzyCzech
źródło
7
Ten nie jest wystarczająco dobry i może powodować błędy w kodzie: $time = strtotime('2011-03-30 01:01:01'); echo date('r', strtotime('-1 month', $time));ten zwróci Wed, 02 Mar 2011 01:01:01 - nie luty! Użyj strtotime('first day of previous month')zamiast tego
Ostin
@OzzyCzech Zwraca 1 i 31 października, kiedy uruchomisz go 3 marca?
The Unknown Dev,
$ data_day_str = strtotime ("poprzedni miesiąc", strtotime ('2011-03-30 01:01:01')); Otrzymasz luty 2011.
Rodrigo Serzedello
31
echo strtotime("-1 month");

Spowoduje to wyświetlenie dokładnego sygnatury czasowej z ostatniego miesiąca. Nie musisz później niczego resetować. Jeśli chcesz, aby później był w formacie angielskim, możesz użyć date () do sformatowania znacznika czasu, tj .:

echo date("Y-m-d H:i:s",strtotime("-1 month"));
zombat
źródło
12
Dzisiaj jest 31 października 2012 r. Date ("Ymd", strtotime ("- 1 miesiąc")); Zwraca 2012-10-01. :(
Todd
7
@toddsler Correct. -1 miesiąc to to samo, co pisanie -30 dni, które w określone dni w ciągu roku albo pominą 1 miesiąc, albo pozostaną w tym samym miesiącu, więc bądź ostrożny z tą metodą.
silkfire
NIE UŻYWAJ TEGO ROZWIĄZANIA! Wcześniejsze komentarze są poprawne, będziesz mieć błędy, które będą wywoływane dopiero 31 dnia miesiąca (lub 29,30,31 marca)
Nastoletnie
19
$prevmonth = date('M Y', strtotime("last month"));
Scharrels
źródło
3
To jest to samo, co date („M Y”, strtotime („- 1 miesiąc”)). Jeśli zrobisz coś takiego jak date („M Y”, strtotime („2017-07-31 ostatni miesiąc”)) to zwróci 2017-07-01, więc bądź ostrożny! date ('M Y', strtotime ('2017-07-31, pierwszy dzień poprzedniego miesiąca')) da ci to, czego chcesz
Shadoweb
12

Niepoprawne odpowiedzi to:

$lastMonth = date('M Y', strtotime("-1 month"));
$lastDate = date('Y-m', strtotime('last month'));

Powodem jest to, że bieżący miesiąc to ponad 30 dni, ale poprzedni to 29 i mniej $ lastMonth będzie taki sam jak bieżący miesiąc.

na przykład

If $currentMonth = '30/03/2016';
echo $lastMonth = date('m-Y', strtotime("-1 month")); => 03-2016
echo $lastDate = date('Y-m', strtotime('last month')); => 2016-03

Prawidłowa odpowiedź to:

echo date("m-Y", strtotime("first day of previous month")); => 02-2016
echo sprintf("%02d",date("m")-1) . date("-Y"); => 02-2016
echo date("m-Y",mktime(0,0,0,date("m")-1,1,date("Y"))); => 02-2016
Furia
źródło
1
Głosowałbym za, jeśli usuniesz echo sprintf („% 02d”, data („m”) - 1). data („- Y”); => 02-2016. Jeśli jesteśmy w styczniu, odpowiada miesiąc 0 tego roku, a nie 12 zeszłego roku!
Tama
6

jeśli chcesz uzyskać tylko poprzedni miesiąc, możesz użyć jako następującego

$prevmonth = date('M Y', strtotime('-1 months'));

jeśli chcesz uzyskać te same dni z poprzedniego miesiąca, możesz użyć w następujący sposób ..

$prevmonth = date('M Y d', strtotime('-1 months'));

jeśli chcesz uzyskać ostatnią datę poprzedniego miesiąca, możesz użyć jako następującego ...

$prevmonth = date('M Y t', strtotime('-1 months'));

jeśli chcesz uzyskać pierwszą datę poprzedniego miesiąca, możesz użyć jako następującego ...

$prevmonth = date('M Y 1', strtotime('-1 months'));
Md. Maruf Hossain
źródło
3
Uważaj na 31. dnia miesiąca! Daje Ci to pierwszy dzień bieżącego miesiąca! Patrz wyżej.
Shadoweb
6
echo date('Y',strtotime("-1 year"));        //last year<br>
echo date('d',strtotime("-1 day"));     //last day<br>
echo date('m',strtotime("-1 month"));       //last month<br>
Vaishu
źródło
3
Ta odpowiedź nie jest poprawna, gdy aktualna data to 31/03/2018. Szczegóły również w ten sposób
Ngoc Nam
4

Znalazłem ten błąd, gdy poprzednie miesiące są krótsze niż obecne.

echo date("Y-m-d H:i:s",strtotime("-1 month"));

Wypróbuj 30 marca, a zamiast 2012-02 otrzymasz 2012-03-01 ...

Opracowanie lepszego rozwiązania ...

Jay_69
źródło
3
Ta odpowiedź jest prawidłowa (-1 miesiąc nie będzie działać poprawnie we wszystkich przypadkach). W przypadku poprzedniego miesiąca użyj strtotime („ostatni miesiąc”).
Mike
1
Ostatni miesiąc lub miesiąc -1 zwraca tę samą wartość.
Etienne Dupuis
3
public function getLastMonth() {
    $now = new DateTime();
    $lastMonth = $now->sub(new DateInterval('P1M'));
    return $lastMonth->format('Ym');
}

źródło
1
Nie będzie działać 2015-10-31w PHP 5.5 i 5.6.11. Otrzymasz 201510- takie samo zachowanie jak w przypadku strtotime('- 1 month).
pmayer
2

Użyj tego krótkiego kodu, aby uzyskać poprzedni miesiąc dla dowolnej daty:

$tgl = '25 january 2012';

$prevmonth = date("M Y",mktime(0,0,0,date("m", strtotime($tgl))-1,1,date("Y", strtotime($tgl))));
echo $prevmonth;

Wynik to grudzień 2011. Działa na miesiąc z krótszym dniem w porównaniu z poprzednim miesiącem.

abdul
źródło
2
$lastMonth = date('M Y', strtotime("-1 month"));
var_dump($lastMonth);
$lastMonth = date('M Y', mktime(0, 0, 0, date('m') - 1, 1, date('Y')));
var_dump($lastMonth);
cholernie numen
źródło
4
Chociaż sam kod może być nieco zrozumiały, innym użytkownikom pomocne jest wyjaśnienie odpowiedzi, a nie tylko podanie kodu.
Turnerj
1

Możesz użyć strtotime, co jest świetne w tego rodzaju sytuacjach:

$timestamp = strtotime('-1 month');
var_dump(date('Y-m', $timestamp));

Dostaniesz:

string '2009-11' (length=7)
Pascal MARTIN
źródło
1
$time = mktime(0, 0, 0, date("m"),date("d")-date("t"), date("Y"));
$lastMonth = date("d-m-Y", $time);

LUB

$lastMonth = date("m-Y", mktime() - 31*3600*24);

działa w dniu 30.03.2012r

Paweł
źródło
1

Och, wymyśliłem to, zignoruj, chyba że masz ten sam problem, co w takim przypadku:

$prevmonth = date("M Y",mktime(0,0,0,date("m")-1,1,date("Y")));
str.
źródło
1

Najlepsze rozwiązanie jakie znalazłem to:

function subtracMonth($currentMonth, $monthsToSubtract){
        $finalMonth = $currentMonth;
        for($i=0;$i<$monthsToSubtract;$i++) {
            $finalMonth--;
            if ($finalMonth=='0'){
                $finalMonth = '12';
            }

        }
        return $finalMonth;

    }

Więc jeśli mamy 3 (marzec) i chcemy odjąć 5 miesięcy, to by było

subtractMonth(3,5);

co dałoby 10 (październik). Jeśli rok jest również pożądany, można to zrobić:

function subtracMonth($currentMonth, $monthsToSubtract){
    $finalMonth = $currentMonth;
    $totalYearsToSubtract = 0;
    for($i=0;$i<$monthsToSubtract;$i++) {
        $finalMonth--;
        if ($finalMonth=='0'){
            $finalMonth = '12';
            $totalYearsToSubtract++;
        }

    }
    //Get $currentYear
    //Calculate $finalYear = $currentYear - $totalYearsToSubtract 
    //Put resulting $finalMonth and $finalYear into an object as attributes
    //Return the object

}
Rafael Anschau
źródło
0

Mi to pasuje:

Dzisiaj jest: 31.03.2012

echo date("Y-m-d", strtotime(date('m', mktime() - 31*3600*24).'/01/'.date('Y').' 00:00:00')); // 2012-02-01
echo  date("Y-m-d", mktime() - 31*3600*24); // 2012-02-29
Yiannis Christodoulou
źródło
W działa tylko w 58,3 (3)% przypadków. A co z lutym, kwietniem, czerwcem, wrześniem i listopadem? Nie mają 31 dni.
Taz
0

Jeśli chcesz uzyskać pierwszą datę poprzedniego miesiąca, możesz użyć jako następujących po ... $prevmonth = date('M Y 1', strtotime('-1 months'));co? pierwsza data zawsze będzie 1: D

user2846324
źródło
31 października 2012. Zwraca 2012-10-01
Akira Yamamoto
0

To pytanie jest dość stare, ale tak czy inaczej. Jeśli próbujesz uzyskać tylko poprzedni miesiąc, a dzień nie ma znaczenia, możesz użyć tego:

$date = '2014-01-03';

$dateTime = new DateTime($date);

$lastMonth = $dateTime->modify('-' . $dateTime->format('d') . ' days')->format('F Y');

echo $lastMonth; // 'December 2013'
Jay Kravetz
źródło
0

Po prostu otrzymaj w zeszłym miesiącu.

Przykład:

Dzisiaj jest: 2020-09-02

Kod:

echo date('Y-m-d', strtotime(date('Y-m-d')." -1 month"));

Wynik:

2020-08-02

SL-phpdeveloper
źródło
Witamy w StackOverflow! Prawdopodobnie powinieneś również rozważyć wyjaśnienie, co się stanie, jeśli dzień jest, 31a miesiąc nie jest styczniem lub sierpniem (jak 2020 May 31się stanie 2020 April 31, że nie istnieje)
xKobalt
wbudowana funkcja php "date", obsłuż to.
SL-phpdeveloper