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.

pengguna2710234
sumber
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 .

Amal Murali
sumber
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');
Glavić
sumber
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

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

...

Greg
sumber
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.

Dereckson
sumber
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"));
}
Trent Renshaw
sumber
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
Nishad Up
sumber
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];
zzapper
sumber
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

Bryan Itur
sumber
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

Tuan Heelis
sumber
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.

Cristo Rutazihana
sumber
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
2

Hanya satu baris

DateTime::createFromFormat('!m', $salary->month)->format('F'); //April
Kaushik shrimali
sumber
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));
Bora
sumber
1
date("F", strtotime($result["month"]))

gunakan kode di atas

Visakh B Sujathan
sumber
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');
 ?>
imtaher
sumber
1
<?php
$month =1;
$convert =DateTime::createFromFormat('!m', $month);
echo $convert->format('F');
?>
Manjeet Kumar Nai
sumber
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 ()

boomx09
sumber
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";
    }
}
Turtle Aneh
sumber
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'

Bijendra Sahu
sumber
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

Vicky Salunkhe
sumber
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

Avinash Raut
sumber
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.

Geovany Quissanga
sumber
-3

Gunakan fungsi asli seperti jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);
Tonin Bolzan
sumber
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)

Sony Krishna Swamy
sumber
1.) PHP ditanya, bukan SQL 2.) Jawaban Anda tampaknya spesifik MySQL, bukan SQL umum.
martti