Konversi angka ke nama bulan di PHP


152

Saya punya kode PHP ini:

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

echo $monthName;

Tapi itu kembali Decemberdaripada August.

$result["month"]sama dengan 8, jadi sprintffungsinya menambahkan a 0untuk membuatnya 08.


6
Kecuali jika Anda mengonversi ini menjadi tanggal penuh (08-21-2013), atau sesuatu yang mirip dengan tanggal strtotimetidak tahu apa yang Anda coba lakukan. Atau gunakan saja saklar untuk hal seperti ini.
phpisuber01

maaf - $ hasil ["bulan"] adalah 8 karena saya punya SQL Query yang mengatakan pilih MONTH (tanggal waktu) dari tabel ... jadi dalam tabel format tanggal penuh
user2710234

1
Tetapi strtotimetidak tahu apa artinya "8". strtotimemem-parsing stempel waktu lengkap seperti "2012-05-12 08:43:12". Apa arti "8" dalam konteks ini?
deceze

mengapa tidak adil echo date( "F", time() );:? Misalnya, echo date( "F", strtotime("2019-03-09") );akan menampilkan "Maret"
Rob Watts

Jawaban:


357

Cara yang disarankan untuk melakukan ini:

Saat ini, Anda harus benar-benar menggunakan objek DateTime untuk matematika tanggal / waktu. Ini mengharuskan Anda untuk memiliki versi PHP> = 5.2. Seperti yang ditunjukkan dalam jawaban Glavić , Anda dapat menggunakan yang berikut:

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

The !format karakter digunakan untuk me-reset semuanya ke zaman Unix . The mkarakter Format adalah representasi numerik dari satu bulan, dengan nol terkemuka.

Solusi alternatif:

Jika Anda menggunakan versi PHP yang lebih lama dan tidak dapat memutakhirkan saat ini, Anda dapat solusi ini. Parameter date()fungsi kedua menerima cap waktu, dan Anda dapat menggunakannya mktime()untuk membuatnya, seperti:

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

Jika Anda ingin nama bulan 3 huruf seperti Mar, ubah Fke M. Daftar semua opsi pemformatan yang tersedia dapat ditemukan dalam dokumentasi manual PHP .


36
Ini tidak menghormati lokal LC_TIME dan akan selalu menampilkan nama bulan dalam bahasa Inggris.
Dereckson

2
Saya tidak pernah melihat ini pada SO - Kesalahan fatal: Memanggil ke format fungsi anggota () pada non-objek di Noone dari 48 plus tidak memilikinya?
Jaroslav Štreit

1
Mengapa Anda mengatakan bahwa kami "benar-benar" menggunakan objek DateTime untuk ini? Objek DateTime berguna, tetapi fungsi date () jauh lebih sederhana karena memiliki overhead yang lebih rendah (dalam hal kecepatan dan memori) jika semua yang Anda coba lakukan adalah sesuatu yang sederhana seperti ini.
orrd

4
@ orrd: Jika perbedaan kecepatan antara date () dan DateTime ternyata menjadi penghambat aplikasi yang Anda buat, saya akan mengatakan Anda memiliki masalah yang lebih besar untuk dikhawatirkan. Untuk aplikasi yang sebenarnya, di mana Anda mau tidak mau harus melakukan hal-hal lain dengan tanggal, kemudian memilikinya dalam suatu objek adalah superior karena itu menjadi lebih mudah untuk membaca API.
Amal Murali

1
@orrd: Agak terkejut hanya menyarankan DateTime menjamin downvote: P Terlalu banyak untuk DRY: artima.com/intv/dry.html
Amal Murali

42

Hanya karena semua orang menggunakan fungsi strtotime () dan date (), saya akan menunjukkan contoh DateTime :

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

Atau, Anda dapat menggunakan DateTime::createFromFormat('m|', $result['month']);untuk mereset hanya bidang yang tidak ada.
nullability

Apakah ada cara untuk mengubah bahasa menggunakan solusi ini?
Michel Ayres

@MichelAyres: Tidak. Anda harus menggunakannya strftime()untuk itu.
Amal Murali

30

Gunakan mktime():

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

Lihat manual PHP: http://php.net/mktime


Apakah ada cara untuk mendapatkan nomor bulan saat nama bulan dilewatkan?
Nisha

@Nisha menggunakan paramter "m"itu akan mengembalikan bulan sebagai angka 2 digit sebagai a string. misal Januari = 01, Februari = 02
Zac

18

strtotime mengharapkan format tanggal standar, dan mengembalikan stempel waktu.

Anda tampaknya strtotimememberikan satu digit untuk mengeluarkan format tanggal.

Anda harus menggunakan mktimeyang menggunakan elemen tanggal sebagai parameter.

Kode lengkap Anda:

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

echo $monthName;

Namun, fungsi mktime tidak memerlukan nol di depan untuk angka bulan, sehingga baris pertama sama sekali tidak perlu, dan $result["month"]dapat diteruskan langsung ke fungsi.

Ini kemudian semua dapat digabungkan menjadi satu baris, menggemakan inline tanggal.

Kode refactored Anda:

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

...


Anehnya date("F", mktime(null, null, null, 2));kembali Marchsebagai gantinya February.
Mischa

4
Sangat diperhatikan, @Mischa. Jika Anda tidak menetapkan hari (parameter ke-5), mktimeakan menggunakan hari ini. Hari ini tanggal 31. Apa tanggal 31 Februari? :)
Greg

Ada kesalahan dalam kode refactored Anda. 1tidak diberikan sebagai parameter ke-5 mktimetetapi sebagai parameter ke-3 dateyang tidak akan menghasilkan hasil yang diharapkan
Ejaz

18

Untuk melakukan konversi sehubungan dengan lokal saat ini, Anda dapat menggunakan strftimefungsi:

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

datetidak menghormati lokal, strftimeya.


Terima kasih, bekerja dengan baik! Namun, saya harus menggunakan $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));untuk menampilkan karakter aksen seperti di 'Août'
Roubi

2
@Roubi Ketika utf8_encode didokumentasikan sebagai "Meng-enkode string ISO-8859-1 ke UTF-8", itu berarti û Anda adalah ISO-8859-1. Jika Anda ingin UTF-8 di mana-mana (dan kode PHP Anda tidak berjalan secara default di UTF-8), Anda dapat menggunakan LC_ALL alih-alih LC_TIME di setlocale.
Dereckson

6

Jika Anda hanya ingin array nama bulan dari awal tahun hingga akhir misalnya untuk mengisi pilihan drop-down, saya hanya akan menggunakan yang berikut;

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

6

Ada banyak cara untuk mencetak sebulan dari nomor yang diberikan. Pilih satu suite untuk Anda.

1. date () berfungsi bersama dengan parameter 'F'

Contoh kode:

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

2. Dengan membuat objek tanggal php menggunakan createFromFormat ()

Contoh Kode

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

3. fungsi strtotime ()

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

4. fungsi mktime ()

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

5. Dengan menggunakan jdmonthname ()

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

4

beradaptasi sesuai kebutuhan

$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
Sederhana dan to the point tanpa konversi tanggal yang tidak perlu.
martti

4

Jika Anda memiliki nomor bulan, pertama-tama Anda dapat membuat tanggal darinya dengan tanggal default 1 dan tahun default tahun berjalan, kemudian ekstrak nama bulan dari tanggal yang dibuat:

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

Kode ini menganggap Anda menyimpan nomor bulan Anda dalam $ i

Semoga ini bisa membantu seseorang



2

ini sepele mudah, mengapa begitu banyak orang membuat saran buruk seperti itu? @ Bor adalah yang terdekat, tapi ini yang paling kuat

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

ini adalah cara untuk melakukannya


2

Saat ini saya menggunakan solusi di bawah ini untuk mengatasi masalah yang sama:

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

Untuk membaca lebih lanjut tentang mengatur lokal, buka http://php.net/manual/en/function.setlocale.php

Untuk mempelajari lebih lanjut tentang strftime, buka http://php.net/manual/en/function.strftime.php

Ucfirst() digunakan untuk menggunakan huruf besar pada huruf pertama dalam sebuah string.


untuk kompatibilitas dengan utf8 coba: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Mimouni

1
@Mimouni Ini tidak diperlukan karena fungsi utf8_encode mengubah string ISO-8859-1 menjadi UTF-8, tetapi melalui LC_ALL, kode dapat diinstruksikan untuk menghasilkan UTF-8, misalnya jika Anda menggunakan en_US.UTF-8 alih-alih KAMI.
Dereckson


1

Anda perlu mengatur bidang dengan strtotimeataumktime

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

Dengan mktimemenetapkan hanya bulan. Coba yang ini:

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


1

Ini untuk semua kebutuhan konversi tanggal

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

Saya pikir menggunakan cal_info () adalah cara termudah untuk mengkonversi dari angka ke string.

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

echo $monthName; //Returns "August"

Lihat dokumen untuk cal_info ()



0

Saya tahu pertanyaan ini ditanyakan beberapa waktu yang lalu sekarang, tetapi saya pikir semua orang mencari jawaban ini mungkin hanya mencoba untuk menghindari menuliskan seluruh pernyataan if / else, jadi saya menulisnya untuk Anda sehingga Anda dapat menyalin / menempel. Satu-satunya peringatan dengan fungsi ini adalah bahwa ia berjalan pada jumlah aktual bulan itu, bukan angka yang diindeks 0, jadi Januari = 1, bukan 0.

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
Mengapa Anda tidak menggunakan sakelar / kasing?
Artjom B.

Bisa saja saya kira, pilihan pribadi sebagian besar, saya menemukan jika / lain lebih mudah dibaca, dan dengan hanya 12 opsi, perbedaan kecepatan akan diabaikan.
Freaky Turtle

ini tidak berfungsi jika Anda memiliki situs web berbasis multi-bahasa
Crustamet

Tidak, tetapi Anda dapat mengganti string yang dikembalikan dengan fungsi i18n yang mengembalikan bulan dalam bahasa pilihan Anda
Freaky Turtle

0

Untuk mendapatkan nama bulan dengan memberikan nomor bulan

$ month_number = 5;

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

Di mana 'F' akan mengembalikan nama bulan Anda Misalnya. 'Mungkin'


0

Beginilah cara saya melakukannya

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

kembali 30 June 2019


0

Trik sederhana di sini Anda dapat menggunakan fungsi strtotime () bisa diterapkan sesuai kebutuhan Anda, nomor konversi ke nama bulan.

1.Jika Anda menginginkan hasil di Jan, Feb dan Mar Kemudian coba di bawah ini dengan 'M' sebagai parameter di dalam tanggal.

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

Output: Mei

/ 2. Anda dapat mencoba dengan 'F' daripada 'M' untuk mendapatkan nama bulan penuh sebagai output Januari Februari Maret dll.

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

Output: Januari


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

Itu ekstrak bulan.


-3

Gunakan fungsi asli seperti jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);

jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);kembaliNovember
Onimusha

jdmonthname () mengharapkan HARI Julian, yang merupakan hitungan hari tambahan yang digunakan dalam astronomi. Hari 0 adalah 01 Januari 4713 SM, Hari 1 adalah 02 Januari 4713 SM, dll. 20 Oktober 2014 (sebagai tanggal Gregorian) adalah hari Julian 2456951 (yang sebagai tanggal Julian adalah 7 Oktober 2014). PHP anehnya tidak menangani 0 Hari Julian dengan benar: echo jdtojulian (0). "<br/>"; echo jdtojulian (1). "<br/>"; echo jdtojulian (2). "<br/>"; pengembalian: 0/0/0 1/2 / -4713 1/3 / -4713
George Langley

-3

Anda bisa menggunakan fungsi monthname () dalam SQL.

SELECT nama bulan (date_column) dari grup tabel menurut nama bulan (date_column)


1.) PHP ditanya, bukan SQL 2.) Jawaban Anda tampaknya spesifik MySQL, bukan SQL umum.
martti
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.