Chuyển đổi số thành tên tháng trong PHP


152

Tôi có mã PHP này:

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

echo $monthName;

Nhưng nó sẽ trở lại Decemberchứ không phải làAugust .

$result["month"]bằng 8, vì vậy sprintfhàm đang thêm a 0để tạo ra nó 08.


6
Trừ khi bạn chuyển đổi nó thành một ngày đầy đủ (08-21-2013), hoặc một cái gì đó gần giống với một ngày strtotimekhông biết bạn đang cố gắng làm gì. Hoặc chỉ cần sử dụng một công tắc cho một cái gì đó như thế này.
phpisuber01

xin lỗi - kết quả $ ["tháng"] là 8 vì tôi có Truy vấn SQL cho biết chọn MONTH (ngày giờ) từ bảng ... vì vậy trong bảng có định dạng ngày đầy đủ
user2710234

1
Nhưng strtotimekhông biết "8" nghĩa là gì. strtotimephân tích dấu thời gian hoàn chỉnh như "2012-05-12 08:43:12". "8" có nghĩa là gì trong bối cảnh này?
lừa dối

Tại sao không chỉ : echo date( "F", time() );? Ví dụ: echo date( "F", strtotime("2019-03-09") );sẽ xuất "Tháng ba"
Rob Watts

Câu trả lời:


357

Cách được đề xuất để làm điều này:

Ngày nay, bạn thực sự nên sử dụng các đối tượng DateTime cho bất kỳ phép toán ngày / giờ nào. Điều này đòi hỏi bạn phải có phiên bản PHP> = 5.2. Như thể hiện trong câu trả lời của Glavić , bạn có thể sử dụng như sau:

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

!tự định dạng được sử dụng để đặt lại mọi thứ về thời đại Unix . Ký mtự định dạng là biểu diễn số của một tháng, với các số 0 đứng đầu.

Giải pháp thay thế:

Nếu bạn đang sử dụng phiên bản PHP cũ hơn và không thể nâng cấp vào lúc này, bạn có thể giải pháp này. Tham số thứ hai của date()hàm chấp nhận dấu thời gian và bạn có thể sử dụng mktime()để tạo một, như vậy:

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

Nếu bạn muốn tên tháng gồm 3 chữ cái Mar, hãy đổi Fthành M. Danh sách tất cả các tùy chọn định dạng có sẵn có thể được tìm thấy trong tài liệu hướng dẫn sử dụng PHP .


36
Điều này không tôn trọng ngôn ngữ LC_TIME và sẽ luôn xuất tên tháng bằng tiếng Anh.
Dereckson

2
Tôi chưa bao giờ thấy điều này trên SO - Lỗi nghiêm trọng: Gọi đến một định dạng hàm thành viên () trên một đối tượng không có trong Noone từ 48 dấu cộng không có điều này?
Jaroslav treit

1
Tại sao bạn nói rằng chúng tôi "thực sự" nên sử dụng các đối tượng DateTime cho việc này? Các đối tượng DateTime là hữu ích, nhưng hàm date () đơn giản hơn nhiều vì có chi phí thấp hơn nhiều (về cả tốc độ và bộ nhớ) nếu tất cả những gì bạn đang cố gắng làm là một cái gì đó đơn giản như thế này.
orrd

4
@orrd: Nếu chênh lệch tốc độ giữa ngày () và DateTime hóa ra là nút cổ chai của ứng dụng bạn đang xây dựng, tôi sẽ nói rằng bạn có vấn đề lớn hơn phải lo lắng. Đối với các ứng dụng thực tế, nơi bạn chắc chắn sẽ cần phải làm những việc khác với ngày tháng, thì việc có nó trong một đối tượng là một ưu thế vì nó dễ đọc API hơn.
Amal Murali

1
@orrd: Kinda ngạc nhiên khi chỉ đề xuất DateTime bảo đảm một downvote: P Rất nhiều cho DRY: artima.com/intv/dry.html
Amal Murali

42

Chỉ vì mọi người đang sử dụng các hàm strtotime () và date (), tôi sẽ hiển thị ví dụ DateTime :

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

Thay phiên, bạn có thể sử dụng DateTime::createFromFormat('m|', $result['month']);để chỉ đặt lại các trường bị thiếu.
nullability

Có cách nào để thay đổi ngôn ngữ bằng giải pháp này không?
Michel Ayres

@MichelAyres: Không. Bạn sẽ phải sử dụng strftime()cho điều đó.
Amal Murali

30

Sử dụng mktime():

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

Xem hướng dẫn sử dụng PHP: http://php.net/mktime


Có cách nào để lấy số tháng khi tên tháng được thông qua không?
Nisha

@Nisha sử dụng paramter "m"nó sẽ trả về tháng dưới dạng số có 2 chữ số là a string. ví dụ: tháng 1 = 01, tháng 2 = 02
Zac

18

strtotime mong đợi một định dạng ngày chuẩn và trả lại dấu thời gian.

Bạn dường như đang đi qua strtotime một chữ số duy nhất để xuất định dạng ngày từ đó.

Bạn nên sử dụng mktime trong đó lấy các yếu tố ngày làm tham số.

Mã đầy đủ của bạn:

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

echo $monthName;

Tuy nhiên, hàm mktime không yêu cầu số 0 dẫn đến số tháng, vì vậy dòng đầu tiên là hoàn toàn không cần thiết và $result["month"] có thể được chuyển thẳng vào hàm.

Điều này sau đó tất cả có thể được kết hợp thành một dòng duy nhất, lặp lại ngày nội tuyến.

Mã tái cấu trúc của bạn:

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

...


Kỳ lạ thay date("F", mktime(null, null, null, 2));lợi nhuận Marchthay vì February.
Mischa

4
Được chú ý, @Mischa. Nếu bạn không đặt một ngày (tham số thứ 5), mktimesẽ sử dụng ngày hiện tại. Hôm nay là ngày 31. Ngày 31 tháng 2 là gì? :)
Greg

Có một lỗi trong mã tái cấu trúc của bạn. 1không được cung cấp làm tham số thứ 5 mktimenhưng là tham số thứ 3 datesẽ không mang lại kết quả như mong đợi
Ejaz

18

Để thực hiện chuyển đổi đối với ngôn ngữ hiện tại, bạn có thể sử dụng strftimechức năng:

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

datekhông tôn trọng địa phương, strftimekhông.


Cảm ơn, làm việc tốt! Tuy nhiên, tôi đã phải sử dụng $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));để hiển thị các ký tự có dấu như trong 'Août'
Roubi

2
@Roubi Vì utf8_encode được ghi lại là "Mã hóa chuỗi ISO-8859-1 thành UTF-8", điều đó có nghĩa là û của bạn là ISO-8859-1. Nếu bạn muốn UTF-8 ở mọi nơi (và mã PHP của bạn không chạy theo mặc định trong UTF-8), bạn có thể sử dụng LC_ALL thay vì LC_TIME trong setlocale.
Dereckson

6

Nếu bạn chỉ muốn một loạt các tên tháng từ đầu năm đến cuối, ví dụ như để điền vào một lựa chọn thả xuống, tôi sẽ chỉ sử dụng như sau;

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

6

Có nhiều cách để in một tháng từ số đã cho. Chọn một bộ cho bạn.

1. hàm date () cùng với tham số 'F'

Mã ví dụ:

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

2. Bằng cách tạo đối tượng ngày php bằng cách sử dụng createFromFormat ()

Mã ví dụ

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

3. Hàm strtotime ()

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

4. Hàm mktime ()

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

5. Bằng cách sử dụng jdmonthname ()

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

4

thích nghi theo yêu cầu

$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
Đơn giản và đến mức không có chuyển đổi ngày không cần thiết.
martti

4

Nếu bạn có số tháng, trước tiên bạn có thể tạo một ngày từ ngày đó với ngày mặc định là năm đầu tiên và năm mặc định của năm hiện tại, sau đó trích xuất tên tháng từ ngày được tạo:

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

Mã này giả sử bạn có số tháng được lưu trữ trong $ i

Hy vọng điều này sẽ giúp ai đó



2

Điều này thật dễ dàng, tại sao nhiều người lại đưa ra những gợi ý tồi như vậy? @Bora là gần nhất, nhưng đây là mạnh nhất

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

Đây là cách để làm điều đó


2

Hiện đang sử dụng giải pháp dưới đây để giải quyết vấn đề tương tự:

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

Để đọc thêm về cài đặt ngôn ngữ, hãy truy cập http://php.net/manual/en/feft.setlocale.php

Để tìm hiểu thêm về strftime, hãy truy cập http://php.net/manual/en/feft.strftime.php

Ucfirst() được sử dụng để viết hoa chữ cái đầu tiên trong một chuỗi.


để tương thích với utf8, hãy thử: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Mimouni

1
@Mimouni Điều này không cần thiết vì hàm utf8_encode chuyển đổi các chuỗi ISO-8859-1 thành UTF-8, nhưng thông qua LC_ALL, mã có thể được hướng dẫn để xuất UTF-8, ví dụ: nếu bạn sử dụng en_US.UTF-8 thay vì CHÚNG TA.
Dereckson


1

Bạn cần đặt các trường có strtotimehoặcmktime

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

Với mktimethiết lập chỉ tháng. Hãy thử cái này:

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


1

Điều này cho tất cả các nhu cầu chuyển đổi thời gian

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

Tôi nghĩ rằng sử dụng cal_info () là cách dễ nhất để chuyển đổi từ số sang chuỗi.

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

echo $monthName; //Returns "August"

Xem tài liệu cho cal_info ()



0

Tôi biết câu hỏi này đã được hỏi cách đây một thời gian trước đây, nhưng tôi đoán rằng mọi người đang tìm câu trả lời này có lẽ chỉ đang cố gắng tránh viết ra toàn bộ câu lệnh if / other, vì vậy tôi đã viết nó cho bạn để bạn có thể sao chép / dán. Nhắc nhở duy nhất với chức năng này là nó đi vào số thực tế của tháng, không phải là số có chỉ số 0, vì vậy tháng 1 = 1, không phải 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
Tại sao bạn không sử dụng switch / case?
Artjom B.

Tôi có thể đoán được, chủ yếu là lựa chọn cá nhân, tôi thấy nếu / khác dễ đọc hơn và chỉ với 12 tùy chọn, mọi khác biệt về tốc độ sẽ không thể bỏ qua.
Rùa Freaky

điều này không hoạt động nếu bạn có trang web đa ngôn ngữ
Crustamet

Không, nhưng bạn có thể thay thế các chuỗi được trả về bằng các hàm i18n trả về tháng bằng ngôn ngữ bạn đã chọn
Freaky Rùa

0

Để có được tên tháng bằng cách cung cấp số tháng

$ tháng_number = 5;

$ thángName = ngày ('F', mktime (0, 0, 0, $ tháng_number, 10));

Trường hợp 'F' sẽ trả lại cho bạn tên tháng Eg. 'Có thể'


0

Đây là cách tôi đã làm nó

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

trả lại 30 June 2019


0

Một thủ thuật đơn giản ở đây bạn có thể sử dụng hàm strtotime () hoàn toàn khả thi theo nhu cầu của bạn, một số chuyển đổi thành tên tháng.

1.Nếu bạn muốn có kết quả vào tháng 1, tháng 2 và tháng 3, hãy thử bên dưới một kết quả với 'M' làm tham số trong ngày.

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

Đầu ra: tháng 5

/ 2. Bạn có thể thử với 'F' thay vì 'M' để lấy tên đầy đủ của tháng làm đầu ra vào tháng 1 tháng 2, v.v.

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

Đầu ra: Tháng 1


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

Điều đó trích xuất các tháng.


-3

Sử dụng một hàm riêng như jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);

jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);trở vềNovember
Onimusha

jdmonthname () mong đợi một NGÀY Julian, là số ngày tăng dần được sử dụng trong thiên văn học. Ngày 0 là ngày 1 tháng 1 năm 4713 trước Công nguyên, ngày 1 là ngày 02 tháng 1 năm 4713 trước Công nguyên, v.v ... ngày 20 tháng 10 năm 2014 (theo ngày của người Gregorian) là ngày Julian 2456951 (mà ngày Julian là ngày 7 tháng 10 năm 2014). PHP kỳ lạ dường như không xử lý đúng Ngày Julian Julian: echo jdtojulian (0). "<br/>"; tiếng vang jdtojulian (1). "<br/>"; tiếng vang jdtojulian (2). "<br/>"; trả về: 0/0/0 1/2 / -4713 1/3 / -4713
George Langley

-3

Bạn chỉ có thể sử dụng hàm thángname () trong SQL.

CHỌN tên tháng (date_column) từ nhóm bảng theo tháng tên (date_column)


1.) PHP đã được hỏi, không phải SQL 2.) Câu trả lời của bạn dường như là cụ thể của MySQL, không phải là SQL chung.
martti
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.