Php'de geçen ayın tarihi alınıyor


86

Geçen ayın tarihini öğrenmek istiyorum. Bunu yazdım:

$prevmonth = date('M Y');

Bu da bana cari ayı / yılı veriyor. Kullanmalıyım diye söyleyemem strtotime, mktime. Zaman damgası için bir şey var mı? Sitemdeki tüm zaman damgaları için tarihin geçen aya ayarlanmaması için daha sonra sıfırlamak için bir şey eklemem gerekir mi? RTM yapmaya çalışıyorum ama bunu anlamak benim için zor.

Yanıtlar:


212

Geçen ayın tarihini öğrenmek çok kolay

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

3 Kasım'da geri dönüyor

2014-10-1
2014-10-31

7
Bu yeterince iyi değil ve kodunuzda hatalara neden olabilir: $time = strtotime('2011-03-30 01:01:01'); echo date('r', strtotime('-1 month', $time));bu, Çar, 02 Mar 2011 01:01:01 - şubat değil! strtotime('first day of previous month')Bunun yerine kullanın
Ostin

@OzzyCzech 3 Mart'ta çalıştırdığınızda 1 ve 31 Ekim mi dönüyor?
The Unknown Dev

$ data_day_str = strtotime ("önceki ay", strtotime ('2011-03-30 01:01:01')); 2011 şubat
ayını

33
echo strtotime("-1 month");

Bu, geçen ayın zaman damgasını tam olarak verecektir. Daha sonra hiçbir şeyi sıfırlamanıza gerek yoktur. Bundan sonra İngilizce biçiminde olmasını istiyorsanız, tarih damgasını biçimlendirmek için date () kullanabilirsiniz, yani:

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

12
Bugün 31 Ekim 2012. date ("Ymd", strtotime ("- 1 ay")); 2012-10-01 döndürür. :(
Todd

7
@toddsler Doğru. -1 ay, yıl içinde belirli tarihlerde 1 ay atlayacak veya aynı ay kalacak olan -30 gün yazmakla aynıdır, bu yüzden bu yönteme dikkat edin.
silkfire

BU ÇÖZÜMÜ KULLANMAYIN! Önceki yorumlar doğrudur, yalnızca ayın 31. gününde (veya martın 29.30.31'inde) tetiklenecek hatalarınız olacaktır
Genç

19
$prevmonth = date('M Y', strtotime("last month"));

3
Bu tarih ('M Y', strtotime ("- 1 ay")) ile aynıdır, eğer tarih ('M Y', strtotime ("2017-07-31 geçen ay")) gibi bir şey yaparsanız 2017-07-01, bu yüzden dikkatli olun! date ('M Y', strtotime ('2017-07-31 önceki ayın ilk günü')) size istediğinizi verir
Shadoweb

12

Yanlış cevaplar:

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

Bunun nedeni, geçerli ayın 30+ gün olması, ancak önceki ayın 29 olması ve sonMonth $ 'dan az olması, mevcut ayla aynı olmasıdır.

Örneğin

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

Doğru cevap:

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

1
Echo sprintf ("% 02d", tarih ("m") - 1) 'i kaldırırsanız olumlu oy verirdim. tarih ("- Y"); => 02-2016. Ocak ayındaysak, geçen yılın 12'sine değil, bu yılın 0. ayına cevap veriyor!
Tama

6

sadece önceki ay almak istiyorsanız, aşağıdaki gibi kullanabilirsiniz

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

Bir önceki ayın aynı günlerini almak istiyorsanız, aşağıdaki gibi kullanabilirsiniz ..

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

Bir önceki ayın son tarihini almak istiyorsanız aşağıdaki gibi kullanabilirsiniz ...

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

Bir önceki ayın ilk tarihini almak istiyorsanız, aşağıdaki gibi kullanabilirsiniz ...

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

3
Ayın 31'ine dikkat edin! Size mevcut ayın 1'ini verecek! Yukarıyı görmek.
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>

3
Mevcut tarih 2018/03/31 olduğunda bu cevap doğru değildir. Ayrıca böyle Detay bu
Ngoc Nam

4

Önceki aylar şimdiki zamandan daha kısa olduğunda bunu yanlış buldum.

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

30 Mart'ta deneyin ve 2012-02 yerine 2012-03-01'i alacaksınız ...

Daha iyi bir çözüm üzerinde çalışmak ...


3
Bu cevap doğrudur (-1 ay her durumda düzgün çalışmayacaktır). Önceki ay için strtotime ('geçen ay') kullanın.
Mike

1
Geçen ay veya -1 ay aynı değeri döndürür.
Etienne Dupuis

4
public function getLastMonth() {
    $now = new DateTime();
    $lastMonth = $now->sub(new DateInterval('P1M'));
    return $lastMonth->format('Ym');
}

1
İçin alışkanlık iş 2015-10-31PHP 5.5 ve 5.6.11. İle 201510aynı davranışa sahip olacaksınız strtotime('- 1 month).
pmayer

2

Herhangi bir tarih için önceki ayı almak için bu kısa kodu kullanın:

$tgl = '25 january 2012';

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

Sonuç Aralık 2011'dir. Bir önceki aya göre daha kısa bir günde çalışır.


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

4
Kodun kendisi bir şekilde kendinden açıklamalı olsa da, diğer kullanıcıların sadece kod vermekten ziyade cevabınızı açıklaması yararlıdır.
Turnerj

1

strtotimeBu tür durumlarda harika olan kullanabilirsiniz :

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

Seni alacak :

string '2009-11' (length=7)

1
$time = mktime(0, 0, 0, date("m"),date("d")-date("t"), date("Y"));
$lastMonth = date("d-m-Y", $time);

VEYA

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

30.03.2012 tarihinde çalışıyor


1

Oh şunu anladım, lütfen benimle aynı sorunu yaşamadıkça görmezden gelin; bu durumda:

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

1

Bulduğum en iyi çözüm şudur:

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

        }
        return $finalMonth;

    }

Yani 3 (Mart) içindeysek ve 5 ayı çıkarmak istiyorsak,

subtractMonth(3,5);

10 (Ekim) verir. Yıl da isteniyorsa, bunu yapabilirsiniz:

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

}

0

Benim için çalışıyor:

Bugün: 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

Vakaların sadece% 58,3'ünde (3) çalışmaktadır. Peki ya Şubat, Nisan, Haziran, Eylül ve Kasım? 31 günleri yoktur.
Taz

0

Bir önceki ayın ilk tarihini almak istiyorsanız, aşağıdaki gibi kullanabilirsiniz ... $prevmonth = date('M Y 1', strtotime('-1 months'));ne? ilk buluşma her zaman 1: D olacaktır


31 Ekim 2012. Geri dönüyor 2012-10-01
Akira Yamamoto

0

Bu soru oldukça eski ama yine de devam ediyor. Sadece önceki ayı almaya çalışıyorsanız ve günün önemi yoksa, bunu kullanabilirsiniz:

$date = '2014-01-03';

$dateTime = new DateTime($date);

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

echo $lastMonth; // 'December 2013'

0

Sadece geçen ay alın.

Misal:

Bugün: 2020-09-02

Kod:

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

Sonuç:

2020-08-02


StackOverflow'a hoş geldiniz! Muhtemelen, ayrıca gün ne olur açıklamak düşünmelisiniz 31ve ay Ocak veya Ağustos (benzemese 2020 May 31olur 2020 April 31ki yok)
xKobalt

php yerleşik işlevi "tarih", onu ele alın.
SL-phpdeveloper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.