แปลงหมายเลขเป็นชื่อเดือนใน PHP


152

ฉันมีรหัส PHP นี้:

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

echo $monthName;

แต่มันกลับมามากกว่าDecemberAugust

$result["month"]จะมีค่าเท่ากับ 8 ดังนั้นsprintfฟังก์ชั่นคือการเพิ่มที่จะทำให้มัน008


6
นอกจากคุณจะแปลงเป็นวันที่เต็มรูปแบบ (08-21-2013) หรือบางสิ่งที่คล้ายกับวันที่อย่างใกล้ชิดจะstrtotimeไม่มีความคิดว่าคุณพยายามทำอะไร หรือใช้สวิตช์สำหรับสิ่งนี้
phpisuber01

ขอโทษ - ผลลัพธ์ $ ["เดือน"] คือ 8 เพราะฉันมี SQL Query ที่ระบุว่าเลือก MONTH (วันที่เวลา) จากตาราง ... ดังนั้นในตารางจะเป็นรูปแบบวันที่แบบเต็ม
user2710234

1
แต่strtotimeไม่รู้ว่า "8" หมายถึงอะไร strtotimeแยกวิเคราะห์การประทับเวลาที่สมบูรณ์เช่น "2012-05-12 08:43:12" "8" หมายถึงอะไรในบริบทนี้
หลอกลวง

ทำไมไม่เพียง: echo date( "F", time() );? ตัวอย่างเช่นecho date( "F", strtotime("2019-03-09") );จะส่งออก "มีนาคม"
Rob Watts

คำตอบ:


357

วิธีที่แนะนำให้ทำ:

ทุกวันนี้คุณควรใช้วัตถุ DateTime สำหรับคณิตศาสตร์วันที่ / เวลา คุณต้องมีเวอร์ชัน PHP> = 5.2 ดังที่แสดงในคำตอบของGlavićคุณสามารถใช้สิ่งต่อไปนี้:

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

!ตัวอักษรการจัดรูปแบบจะใช้ในการตั้งค่าทุกอย่างกับยุคยูนิกซ์ mตัวอักษรรูปแบบคือการแสดงเป็นตัวเลขของเดือนที่มีเลขศูนย์ชั้นนำ

ทางเลือกอื่น ๆ :

หากคุณใช้ PHP เวอร์ชันเก่ากว่าและไม่สามารถอัปเกรดได้ในขณะนี้คุณสามารถแก้ไขปัญหานี้ได้ พารามิเตอร์ที่สองของdate()ฟังก์ชั่นยอมรับการประทับเวลาและคุณสามารถใช้mktime()เพื่อสร้างหนึ่งเช่น:

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

ถ้าคุณต้องการชื่อเดือน 3 ตัวอักษรเช่นMarการเปลี่ยนแปลงไปF Mรายชื่อของทุกรูปแบบตัวเลือกที่มีอยู่สามารถพบได้ในเอกสารคู่มือ PHP


36
สิ่งนี้ไม่เกี่ยวข้องกับโลแคล LC_TIME และจะส่งชื่อเดือนเป็นภาษาอังกฤษเสมอ
Dereckson

2
ฉันไม่เคยเห็นสิ่งนี้ใน SO - ข้อผิดพลาดร้ายแรง: การโทรไปยังรูปแบบฟังก์ชั่นสมาชิก () บนวัตถุที่ไม่ใช่ใน Noone จาก 48 pluses ไม่มีสิ่งนี้หรือไม่?
Jaroslav retreit

1
ทำไมคุณถึงบอกว่าเรา "ควร" กำลังใช้วัตถุ DateTime สำหรับสิ่งนี้? วัตถุ DateTime มีประโยชน์ แต่ฟังก์ชั่น date () นั้นง่ายกว่ามากเนื่องจากมีค่าใช้จ่ายที่ต่ำกว่ามาก (ทั้งในแง่ของความเร็วและหน่วยความจำ) หากสิ่งที่คุณพยายามทำนั้นเป็นสิ่งที่ง่ายเช่นนี้
59

4
@ หรือ: หากความแตกต่างของความเร็วระหว่าง date () และ DateTime กลายเป็นคอขวดของแอปพลิเคชันที่คุณกำลังสร้างฉันจะบอกว่าคุณมีปัญหาใหญ่กว่าที่ต้องกังวล สำหรับแอปพลิเคชั่นจริงที่คุณจำเป็นต้องทำสิ่งต่าง ๆ กับวันที่อย่างหลีกเลี่ยงไม่ได้แล้วการมีมันอยู่ในวัตถุนั้นดีกว่าเพราะมันอ่าน API ได้ง่ายกว่า
Amal Murali

1
@ หรือ: Kinda ประหลาดใจเพียงแนะนำ DateTime รับประกัน downvote: P มากสำหรับ DRY: artima.com/intv/dry.html
Amal Murali

42

เพียงเพราะทุกคนใช้ฟังก์ชัน strtotime () และ date () ฉันจะแสดงตัวอย่างDateTime :

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

หรือคุณสามารถใช้DateTime::createFromFormat('m|', $result['month']);เพื่อรีเซ็ตเฉพาะฟิลด์ที่หายไป
แน่นอน

มีวิธีในการเปลี่ยนภาษาโดยใช้วิธีนี้หรือไม่?
Michel Ayres

@MichelAyres: ไม่ คุณจะต้องใช้strftime()สิ่งนั้น
Amal Murali

30

ใช้mktime():

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

ดูคู่มือ PHP: http://php.net/mktime


มีวิธีรับหมายเลขเดือนเมื่อส่งชื่อเดือนหรือไม่
Nisha

ใช้ @Nisha พารามิเตอร์"m"ก็จะกลับเดือนเป็นตัวเลข 2 stringหลักเป็น เช่นมกราคม = 01, กุมภาพันธ์ = 02
Zac

18

strtotime คาดว่ารูปแบบวันที่มาตรฐานและส่งคืนเวลา

คุณดูเหมือนจะผ่านstrtotimeตัวเลขหนึ่งหลักเพื่อส่งออกรูปแบบวันที่จาก

คุณควรใช้mktimeซึ่งใช้องค์ประกอบวันที่เป็นพารามิเตอร์

รหัสเต็มของคุณ:

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

echo $monthName;

อย่างไรก็ตามฟังก์ชั่น mktime ไม่ต้องการเลขศูนย์นำหน้าไปยังหมายเลขเดือนดังนั้นบรรทัดแรกจึงไม่จำเป็นอย่างสมบูรณ์และ$result["month"]สามารถส่งผ่านไปยังฟังก์ชันได้โดยตรง

ทั้งหมดนี้สามารถรวมกันเป็นบรรทัดเดียวโดยสะท้อนวันที่แบบอินไลน์

รหัส refactored ของคุณ:

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

...


น่าแปลกที่date("F", mktime(null, null, null, 2));ผลตอบแทนแทนMarch February
Mischa

4
สังเกตได้ดี @Mischa หากคุณไม่ได้ตั้งค่าวัน (พารามิเตอร์ที่ 5) mktimeจะใช้วันที่ปัจจุบัน วันนี้เป็นวันที่ 31 31 กุมภาพันธ์คืออะไร :)
Greg

มีข้อผิดพลาดในรหัส refactored ของคุณ 1ไม่ได้ถูกจัดให้เป็นพารามิเตอร์ที่ 5 mktimeแต่เป็นพารามิเตอร์ที่ 3 dateซึ่งจะไม่ให้ผลลัพธ์ที่คาดหวัง
Ejaz

18

หากต้องการทำการแปลงตามโลแคลปัจจุบันคุณสามารถใช้strftimeฟังก์ชัน:

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

dateไม่เคารพสถานที่strftimeทำ


ขอบคุณทำงานได้ดี! อย่างไรก็ตามฉันต้องใช้$monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));เพื่อแสดงอักขระที่เน้นเสียงเช่น 'Août'
Roubi

2
@Roubi เนื่องจาก utf8_encode มีเอกสารว่า "เข้ารหัสสตริง ISO-8859-1 เป็น UTF-8" หมายความว่าûของคุณคือ ISO-8859-1 หากคุณต้องการ UTF-8 ทุกหนทุกแห่ง (และโค้ด PHP ของคุณไม่ทำงานตามค่าเริ่มต้นใน UTF-8) คุณสามารถใช้ LC_ALL แทน LC_TIME ใน setlocale
Dereckson

6

ถ้าคุณแค่ต้องการชื่อของเดือนตั้งแต่ต้นปีจนถึงสิ้นเช่นเพื่อเติมการเลือกแบบหล่นลงฉันจะใช้สิ่งต่อไปนี้

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

6

มีหลายวิธีในการพิมพ์เดือนจากจำนวนที่กำหนด เลือกหนึ่งชุดให้คุณ

1. ฟังก์ชัน date () พร้อมกับพารามิเตอร์ 'F'

ตัวอย่างรหัส:

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

2. โดยการสร้างวัตถุวันที่ php โดยใช้ createFromFormat ()

ตัวอย่างรหัส

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

3. ฟังก์ชั่น strtotime ()

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

4. ฟังก์ชั่น mktime ()

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

5. โดยใช้ jdmonthname ()

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

4

ปรับตามความต้องการ

$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
ง่ายและตรงประเด็นโดยไม่มีการแปลงวันที่ที่ไม่จำเป็น
martti

4

หากคุณมีหมายเลขเดือนคุณสามารถสร้างวันที่จากนั้นด้วยวันที่เริ่มต้นของวันที่ 1 และปีเริ่มต้นของปีปัจจุบันจากนั้นแยกชื่อเดือนจากวันที่สร้าง:

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

รหัสนี้สมมติว่าคุณมีหมายเลขเดือนของคุณเก็บไว้ใน $ i

หวังว่านี่จะช่วยใครซักคน



2

เรื่องนี้ง่ายนิดเดียวทำไมผู้คนมากมายถึงให้คำแนะนำที่ไม่ดี @Bora ใกล้เคียงที่สุด แต่นี่แข็งแกร่งที่สุด

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

นี่คือวิธีที่จะทำ


2

กำลังใช้วิธีแก้ไขปัญหาด้านล่างเพื่อแก้ไขปัญหาเดียวกัน:

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

หากต้องการอ่านเพิ่มเติมเกี่ยวกับสถานที่ตั้งให้ไปที่http://php.net/manual/en/function.setlocale.php

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ strftime ไปที่http://php.net/manual/en/function.strftime.php

Ucfirst() ใช้เพื่อพิมพ์อักษรตัวแรกในสตริง


สำหรับความเข้ากันได้กับ utf8 ลอง: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Mimouni

1
@Mimouni สิ่งนี้ไม่จำเป็นเนื่องจากฟังก์ชั่น utf8_encode แปลงสตริง ISO-8859-1 เป็น UTF-8 แต่ผ่าน LC_ALL รหัสสามารถสั่งให้เอาท์พุท UTF-8 เช่นถ้าคุณใช้ en_US.UTF-8 แทน เรา.
Dereckson


1

คุณต้องตั้งค่าฟิลด์ด้วยstrtotimeหรือmktime

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

พร้อมmktimeตั้งเดือนเดียว ลองอันนี้:

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


1

สิ่งนี้สำหรับทุกความต้องการในการแปลงวันที่

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


0

ฉันคิดว่าการใช้ cal_info () เป็นวิธีที่ง่ายที่สุดในการแปลงจากตัวเลขเป็นสตริง

$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 ()



0

ฉันรู้ว่าคำถามนี้ถูกถามเมื่อไม่นานมานี้ แต่ฉันคิดว่าทุกคนที่มองหาคำตอบนี้อาจจะพยายามหลีกเลี่ยงการเขียนคำสั่ง if / else ทั้งหมดดังนั้นฉันจึงเขียนออกมาเพื่อคุณเพื่อให้คุณสามารถคัดลอก / วางได้ ข้อแม้เดียวที่มีฟังก์ชั่นนี้คือมันเป็นไปตามจำนวนที่แท้จริงของเดือนไม่ใช่ตัวเลขดัชนี 0 ดังนั้นมกราคม = 1 ไม่ใช่ 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
ทำไมคุณไม่ใช้สวิตช์ / เคส?
Artjom B.

เป็นไปได้ไหมที่ฉันเดาตัวเลือกส่วนบุคคลเป็นส่วนใหญ่ฉันพบว่า / อื่นง่ายต่อการอ่านและมีเพียง 12 ตัวเลือกความแตกต่างของความเร็วจะถูกละเลย
Turtle Freaky

สิ่งนี้ใช้ไม่ได้หากคุณมีเว็บไซต์หลายภาษา
Crustamet

ไม่ แต่คุณสามารถแทนที่สตริงที่ส่งคืนด้วยฟังก์ชัน i18n ซึ่งส่งคืนเดือนในภาษาที่คุณเลือก
Freaky Turtle

0

เพื่อรับชื่อเดือนโดยระบุหมายเลขเดือน

$ month_number = 5;

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

ตำแหน่ง 'F' จะส่งคืนเดือนให้คุณชื่อเช่น 'อาจ'


0

นี่คือวิธีที่ฉันทำ

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

ผลตอบแทน 30 June 2019


0

เทคนิคง่ายๆที่นี่คุณสามารถใช้ strtotime () ฟังก์ชั่นใช้งานได้ตามความต้องการของคุณจำนวนแปลงเป็นชื่อเดือน

1. หากคุณต้องการผลลัพธ์ในเดือนมกราคม, กุมภาพันธ์และเดือนมีนาคมจากนั้นลองด้านล่างหนึ่งโดยใช้ 'M' เป็นพารามิเตอร์ภายในวันที่

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

เอาท์พุท: พฤษภาคม

/ 2 คุณสามารถลองด้วย 'F' แทน 'M' เพื่อรับชื่อเต็มเดือนเป็นผลลัพธ์มกราคมกุมภาพันธ์มีนาคมเป็นต้น

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

เอาท์พุท: มกราคม



-3

ใช้ฟังก์ชั่นพื้นเมืองเช่นjdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);

jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);ผลตอบแทนNovember
Onimusha

jdmonthname () คาดว่าจะเป็น Julian DAY ซึ่งเป็นจำนวนวันที่เพิ่มขึ้นที่ใช้ในดาราศาสตร์ วันที่ 0 คือวันที่ 1 มกราคม 4713 ปีก่อนคริสตกาลวันที่ 1 คือวันที่ 2 มกราคม 4713 ปีก่อนคริสตกาลและอื่น ๆ วันที่ 20 ตุลาคม 2014 (ตามวันเกรโกเรียน) คือวันที่จูเลียน 2456951 (ซึ่งเป็นวันที่จูเลียนคือ 7 ตุลาคม 2014) PHP ดูเหมือนว่าจะจัดการ 0 Julian Day ไม่ถูกต้อง: echo jdtojulian (0) "<br/>"; echo jdtojulian (1). "<br/>"; echo jdtojulian (2). "<br/>"; ผลตอบแทน: 0/0/01 1/2 / -4713 1/3 / -4713
George Langley

-3

คุณสามารถใช้ฟังก์ชัน monthname () ใน SQL

SELECT monthname (date_column) จากกลุ่มตารางโดย monthname (date_column)


1. ) PHP ถูกถามไม่ใช่ SQL 2. ) คำตอบของคุณน่าจะเป็น MySQL ที่เจาะจงไม่ใช่ SQL ทั่วไป
martti
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.