PHP'de sayıyı ay adına dönüştür


152

Bu PHP kodu var:

$monthNum = sprintf("%02s", $result["month"]);
$monthName = date("F", strtotime($monthNum));

echo $monthName;

Ama bunun Decemberyerine geri dönüyor August.

$result["month"]8'e eşittir, bu nedenle sprintfişlev 0bunu yapmak için a ekler 08.


6
Bunu tam bir tarihe (08-21-2013) dönüştürmediğiniz sürece veya bir tarihe çok benzeyen bir strtotimeşeyin ne yapmaya çalıştığınız hakkında hiçbir fikri yoktur. Alternatif olarak böyle bir şey için bir anahtar kullanın.
phpisuber01

üzgünüm - $ sonuç ["ay"] 8 çünkü tablodan AY seçin (tarih saat) diyor bir SQL Sorgusu var ... bu yüzden tabloda onun bir tam tarih biçimi
user2710234

1
Ama strtotime"8" in ne anlama geldiği hakkında hiçbir fikri yok strtotime"2012-05-12 08:43:12" gibi tam zaman damgalarını ayrıştırır. "8" bu bağlamda ne anlama geliyor?
deceze

neden sadece: echo date( "F", time() );? Örneğin, echo date( "F", strtotime("2019-03-09") );"Mart" çıktısı verecek
Rob Watts

Yanıtlar:


357

Bunu yapmanın önerilen yolu:

Günümüzde, herhangi bir tarih / saat matematiği için gerçekten DateTime nesnelerini kullanıyor olmalısınız. Bunun için PHP sürümünüzün = 5.2 olması gerekir. Glavić'in cevabında gösterildiği gibi , aşağıdakileri kullanabilirsiniz:

$monthNum  = 3;
$dateObj   = DateTime::createFromFormat('!m', $monthNum);
$monthName = $dateObj->format('F'); // March

!Biçimlendirme karakteri için her şeyi sıfırlamak için kullanılır Unix çağın . mBiçim karakter lider sıfır ile bir ay sayısal temsili vardır.

Alternatif çözüm:

Daha eski bir PHP sürümü kullanıyorsanız ve şu anda yükseltme yapamıyorsanız, bu çözümü kullanabilirsiniz. İkinci parametredate()Fonksiyonun bir zaman damgasını kabul eder ve mktime()bir tane oluşturmak için kullanabilirsiniz , şöyle:

$monthNum  = 3;
$monthName = date('F', mktime(0, 0, 0, $monthNum, 10)); // March

Eğer gibi 3 harfli ay adını isterseniz Mardeğişikliği Fiçin M. Kullanılabilir tüm biçimlendirme seçeneklerinin listesi PHP el kitabında bulunabilir .


36
Bu, LC_TIME yerel ayarına uymaz ve her zaman ay adını İngilizce olarak verir.
Dereckson

2
Hiç SO gördüm - Ölümcül hata: Noon 48 bir nesneyi olmayan bir nesne üzerinde bir üye işlev formatı () çağrısı bu yoktu?
Jaroslav Štreit

1
Bunun için DateTime nesnelerini "gerçekten" kullanmamız gerektiğini neden söylüyorsunuz? DateTime nesneleri yararlıdır, ancak yapmaya çalıştığınız tek şey böyle basitse, date () işlevi çok daha düşük ek yüke (hem hız hem de bellek açısından) çok daha basittir.
orrd

4
@orrd: date () ve DateTime arasındaki hız farkı, oluşturduğunuz uygulamanın darboğazı haline gelirse, endişelenmeniz gereken daha büyük sorunlarınız olduğunu söyleyebilirim. Kaçınılmaz olarak tarihlerle başka şeyler yapmanız gereken gerçek uygulamalar için, daha sonra API'da okunması daha kolay olduğu için bir nesnede olması bir üstündür.
Amal Murali

1
@orrd: Kinda sadece DateTime'ın bir intikam emri verdiğini şaşırttı: P DRY için çok şey var: artima.com/intv/dry.html
Amal Murali

42

Herkes strtotime () ve date () fonksiyonlarını kullandığından DateTime örneğini göstereceğim :

$dt = DateTime::createFromFormat('!m', $result['month']);
echo $dt->format('F');

Alternatif olarak, DateTime::createFromFormat('m|', $result['month']);yalnızca eksik alanları sıfırlamak için kullanabilirsiniz .
nullability

Bu çözümü kullanarak dili değiştirmenin bir yolu var mı?
Michel Ayres

@MichelAyres: Hayır. Bunun için kullanmanız gerekecek strftime().
Amal Murali

30

Kullanım mktime():

<?php
 $monthNum = 5;
 $monthName = date("F", mktime(0, 0, 0, $monthNum, 10));
 echo $monthName; // Output: May
?>

PHP kılavuzuna bakın: http://php.net/mktime


Ay adı geçtiğinde ay numarasını almanın bir yolu var mı?
Nisha

@Nisha parametre kullanın "m", ayı 2 basamaklı bir sayı olarak döndürür string. örneğin Ocak = 01, Şubat = 02
Zac

18

strtotime standart bir tarih biçimi bekler ve zaman damgasını iletir.

strtotimeTarih biçiminin çıktısını almak için tek bir rakam geçiyor gibi görünüyorsunuz .

mktimeTarih öğelerini parametre olarak alan öğeyi kullanmalısınız .

Tam kodunuz:

$monthNum = sprintf("%02s", $result["month"]);
$monthName = date("F", mktime(null, null, null, $monthNum));

echo $monthName;

Bununla birlikte, mktime işlevi ay numarasına bir ön sıfır gerektirmez, bu nedenle ilk satır tamamen gereksizdir ve $result["month"]doğrudan işleve geçirilebilir.

Bu daha sonra tarih tek satırda birleştirilerek tek bir satıra birleştirilebilir.

Yeniden düzenlenmiş kodunuz:

echo date("F", mktime(null, null, null, $result["month"], 1));

...


Garip bir şekilde yerine date("F", mktime(null, null, null, 2));döner . MarchFebruary
Mischa

4
İyi fark edildi, @Mischa. Bir gün ayarlamazsanız (5. parametre) mktimegeçerli günü kullanır. Bugün 31. 31 Şubat nedir? :)
Greg

Yeniden düzenlenmiş kodunuzda bir hata var. 15. parametre mktimeolarak datedeğil, beklenen sonuçları vermeyecek 3. parametre olarak sağlanıyor
Ejaz

18

Dönüştürmeyi geçerli yerel ayara göre yapmak için şu strftimeişlevi kullanabilirsiniz :

setlocale(LC_TIME, 'fr_FR.UTF-8');                                              
$monthName = strftime('%B', mktime(0, 0, 0, $monthNumber));

dateyerel ayara saygı strftimeduymaz.


Teşekkürler, iyi çalışıyor! Ancak, $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));'Août'
Roubi

2
@Roubi utf8_encode "ISO-8859-1 dizesini UTF-8'e kodlar" olarak belgelendiğinden, û değerinin ISO-8859-1 olduğu anlamına gelir. Her yerde UTF-8 istiyorsanız (ve PHP kodunuz UTF-8'de varsayılan olarak çalışmazsa), setlocale içinde LC_TIME yerine LC_ALL kullanabilirsiniz.
Dereckson

6

Yıl başından sonuna kadar bir dizi ay ismi istiyorsanız, örneğin bir açılır menü seçmek için, sadece aşağıdakileri kullanırdım;

for ($i = 0; $i < 12; ++$i) {
  $months[$m] = $m = date("F", strtotime("January +$i months"));
}

6

Verilen numaradan bir ay yazdırmanın birçok yolu vardır. Sizin için bir süit seçin.

1. date () fonksiyonu ve 'F' parametresi

Kod örneği:

$month_num = 10;
echo date("F", mktime(0, 0, 0, $month_num, 10)); //output: October

2. createFromFormat () kullanarak php date nesnesi oluşturarak

Kod Örneği

$dateObj   = DateTime::createFromFormat('!m', $monthNum);
echo "month name: ".$dateObj->format('F'); // Output: October

3. strtotime () işlevi

echo date("F", strtotime('00-'.$monthNum.'-01')); // Output: October

4. mktime () işlevi

echo date("F", mktime(null, null, null, $monthNum)); // Output: October

5. jdmonthname () kullanarak

$jd=gregoriantojd($monthNum,10,2019);
echo jdmonthname($jd,0); // Output: Oct

4

gerektiği gibi uyarlayın

$m='08';
$months = array (1=>'Jan',2=>'Feb',3=>'Mar',4=>'Apr',5=>'May',6=>'Jun',7=>'Jul',8=>'Aug',9=>'Sep',10=>'Oct',11=>'Nov',12=>'Dec');
echo $months[(int)$m];

1
Basit ve gereksiz tarih dönüşümleri olmadan noktaya.
martti

4

Ay numaranız varsa, ilk olarak ondan varsayılan tarih ve geçerli yılın varsayılan yılı olan bir tarih oluşturabilir, ardından ay adını oluşturulan tarihten çıkarabilirsiniz:

echo date("F", strtotime(date("Y") ."-". $i ."-01"))

Bu kod, ay numaranızı $ i içinde sakladığınızı varsayar

Umarım bu birine yardımcı olur



2

bu çok kolay, neden bu kadar çok insan bu kadar kötü önerilerde bulunuyor? @Bora en yakınıydı, ama bu en sağlam

/***
 * returns the month in words for a given month number
 */
date("F", strtotime(date("Y")."-".$month."-01"));

Bunu yapmanın yolu bu


2

Şu anda aynı sorunu çözmek için aşağıdaki çözümü kullanıyorum:

//set locale, 
setlocale(LC_ALL,"US");

//set the date to be converted
$date = '2016-08-07';

//convert date to month name
$month_name =  ucfirst(strftime("%B", strtotime($date)));

echo $month_name;

Yerel ayarı ayarla hakkında daha fazla bilgi için şu adrese gidin: http://php.net/manual/en/function.setlocale.php

Strftime hakkında daha fazla bilgi edinmek için http://php.net/manual/en/function.strftime.php adresine gidin.

Ucfirst() bir dizedeki ilk harfi büyük yapmak için kullanılır.


utf8 ile uyumluluk için şunu deneyin: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Mimouni

1
@Mimouni Bu, utf8_encode işlevi ISO-8859-1 dizelerini UTF-8'e dönüştürdüğü için gerekli değildir, ancak LC_ALL aracılığıyla, örneğin UT_8 yerine EN_US.UTF-8 kullanırsanız bu koda UTF-8 çıktısı vermesi istenebilir. BİZE.
Dereckson

2

Sadece bir satır

DateTime::createFromFormat('!m', $salary->month)->format('F'); //April

1

Sen ile ayarlanan alanları ihtiyaç strtotimeveyamktime

echo date("F", strtotime('00-'.$result["month"].'-01'));

İle mktimebelirlenen Sadece ay. Bunu dene:

echo date("F", mktime(0, 0, 0, $result["month"], 1));


1

Bu, tarih-saat dönüştürmenin tüm ihtiyaçları için

 <?php
 $newDate = new DateTime('2019-03-27 03:41:41');
 echo $newDate->format('M d, Y, h:i:s a');
 ?>

1
<?php
$month =1;
$convert =DateTime::createFromFormat('!m', $month);
echo $convert->format('F');
?>

0

Cal_info () kullanarak sayıdan dizeye dönüştürmek için en kolay yol olduğunu düşünüyorum.

$monthNum = sprintf("%02s", $result["month"]); //Returns `08`
$monthName = cal_info(0); //Returns Gregorian (Western) calendar array
$monthName = $monthName[months][$monthNum];

echo $monthName; //Returns "August"

Cal_info () için dokümanlara bakın



0

Bu soruyu bir süre önce sorulduğunu biliyorum, ama bu cevabı arayan herkesin tüm if / else ifadelerini yazmaktan kaçınmaya çalıştığını düşündüm, bu yüzden sizin için yazdım, böylece kopyalayıp yapıştırabilirsiniz. Bu işleve sahip tek uyarı, 0 dizinli bir sayıya değil, ayın gerçek sayısına devam etmesidir, bu nedenle Ocak = 1, 0 değil.

function getMonthString($m){
    if($m==1){
        return "January";
    }else if($m==2){
        return "February";
    }else if($m==3){
        return "March";
    }else if($m==4){
        return "April";
    }else if($m==5){
        return "May";
    }else if($m==6){
        return "June";
    }else if($m==7){
        return "July";
    }else if($m==8){
        return "August";
    }else if($m==9){
        return "September";
    }else if($m==10){
        return "October";
    }else if($m==11){
        return "November";
    }else if($m==12){
        return "December";
    }
}

4
Neden switch / case kullanmadınız?
Artjom B.

Sanırım yapabilirdim, kişisel seçim çoğunlukla, daha kolay / eğer daha kolay olup olmadığını buluyorum ve sadece 12 seçenekle, herhangi bir hız farkı ihmal edilebilir.
Freaky Turtle

çok dilli bir web siteniz varsa bu işe yaramaz
Crustamet

Hayır, ancak döndürülen dizeleri, ayı seçtiğiniz dilde döndüren i18n işlevleriyle değiştirebilirsiniz
Freaky Turtle

0

Ay numarasını girerek ay adını almak için

$ month_number = 5;

$ monthName = tarih ('F', mktime (0, 0, 0, $ month_number, 10));

Burada 'F' size ay adını döndürür Eg. 'Mayıs'


0

Ben böyle yaptım

// sets Asia/Calcutta time zone
date_default_timezone_set("Asia/Calcutta");

//fetches current date and time
$date = date("Y-m-d H:i:s");

$dateArray = date_parse_from_format('Y/m/d', $date);
$month = DateTime::createFromFormat('!m', $dateArray['month'])->format('F');
$dateString = $dateArray['day'] . " " . $month  . " " . $dateArray['year'];

echo $dateString;

İadeler 30 June 2019


0

Burada basit hileler, ihtiyaca göre çalışabilen strtotime () fonksiyonunu, ay ismine dönüştürmek için kullanabilirsiniz.

1.Jan, Şubat ve Mar'da bir sonuç istiyorsanız, tarihin içinde bir parametre olarak 'M' ile bir tane deneyin.

$month=5;
$nmonth = date('M',strtotime("01-".$month."-".date("Y")));
echo $nmonth;

Çıktı: Mayıs

/ 2. Tam ay adını Ocak Şubat Mart vb. Çıktı olarak almak için 'M' yerine 'F' ile deneyebilirsiniz.

$month=1;
$nmonth = date('M',strtotime("01-".$month."-".date("Y")));
echo $nmonth;

Çıktı: Ocak


0
$days = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
$month = ( date('m') < 10 ) ? date('m')[1] : date('m');

Bu ayları ayıklar.


-3

Yerel bir işlev kullanın jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);

jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);dönerNovember
Onimusha

jdmonthname (), astronomide kullanılan artımlı gün sayısı olan bir Julian GÜNÜ'nü bekler. Gün 0 01 Ocak 4713, Gün 1 02 Ocak 4713, vb. İdi. 20 Ekim 2014 (Gregoryen tarihi olarak) Julian günü 2456951'dir (Julian tarihi olarak 7 Ekim 2014'tür). PHP garip bir şekilde 0 Julian Günü'nü düzgün işlemiyor gibi görünüyor: echo jdtojulian (0). "<br/>"; echo jdtojulian (1). "<br/>"; echo jdtojulian (2). "<br/>"; dönüş: 0/0/0 1/2/44713 1/3 / -4713
George Langley

-3

SQL'de monthname () işlevini kullanabilirsiniz.

Ay adına göre tablo grubundan ay adını (tarih_ sütunu) SEÇİN (tarih_ sütunu)


1.) PHP değil SQL istendi. 2. Cevabınız genel SQL değil, MySQL'e özgü görünüyor.
martti
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.