在PHP中将数字转换为月份名称


152

我有这个PHP代码:

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

echo $monthName;

但这是返回December而不是August

$result["month"]等于8,因此sprintf函数要添加一个0使其08


6
除非您将其转换为一个完整的日期(2013年8月21日),否则将很难像一个日期一样strtotime不知道您要做什么。另外,也可以使用类似这样的开关。
phpisuber01 2013年

遗憾-在$结果[“月”]是8,因为我有一个SQL查询,从表说选择月(日期时间)...所以在表中的一个完整的日期格式
user2710234

1
但是strtotime不知道“ 8”是什么意思。strtotime解析完整的时间戳,例如“ 2012-05-12 08:43:12”。在这种情况下,“ 8”是什么意思?
deceze

为什么不只是:echo date( "F", time() );?例如,echo date( "F", strtotime("2019-03-09") );将输出“ March”
Rob Watts

Answers:


357

推荐的方法是:

如今,您应该真正将DateTime对象用于任何日期/时间数学计算。这需要您的PHP版本> = 5.2。如Glavić的答案所示,您可以使用以下命令:

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

!格式化字符用于重置一切的Unix纪元。该m格式字符是一月份的数字表示,用前导零。

替代解决方案:

如果您使用的是较旧的PHP版本,并且目前无法升级,则可以使用此解决方案。date()函数的第二个参数接受时间戳,您可以使用它mktime()来创建一个时间戳,如下所示:

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

如果您想要3个字母的月份名称Mar,请更改FM。所有可用格式选项的列表都可以在PHP手册文档中找到


36
这不遵守LC_TIME语言环境,并且将始终以英语输出月份名称。
Dereckson 2014年

2
我从没在SO上看到过此错误-致命错误:从48个加号中调用Noone中非对象上的成员函数format()没有这个吗?
JaroslavŠtreit,2015年

1
为什么说我们“真的”应该为此使用DateTime对象?DateTime对象很有用,但是date()函数要简单得多,如果您要做的只是这样的简单操作,则其开销(在速度和内存方面)要低得多。
orrd

4
@orrd:如果date()和DateTime之间的速度差异竟然是您正在构建的应用程序的瓶颈,那么我想说您还有更大的问题要担心。对于实际的应用程序,您不可避免地需要对日期进行其他操作,然后将其包含在对象中将是一个优势,因为它更易于阅读API。
阿马尔·穆拉利

1
@orrd:Kinda惊讶地只是暗示DateTime值得一票: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']);仅重置缺少的字段。
nullability,2014年

有没有办法使用此解决方案更改语言?
Michel Ayres 2014年

@MichelAyres:不。您将不得不使用strftime()它。
阿马尔·穆拉利

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
扎克

18

strtotime 需要标准的日期格式,并传回时间戳记。

你好像过去了 strtotime了一位数字来输出日期格式。

您应该使用 mktime将日期元素作为参数的方法。

您的完整代码:

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

echo $monthName;

但是,mktime函数不需要以零开头的月份号,因此第一行完全没有必要,并且 $result["month"]可以直接传递给该函数。

然后可以将其全部合并为一行,以回显日期内联的日期。

您的重构代码:

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

...


奇怪地date("F", mktime(null, null, null, 2));返回March而不是February
Mischa 2015年

4
很好注意到,@ Mischa。如果您未设置日期(第5个参数),mktime则将使用当前日期。今天是31日。2月31日是几点?:)
Greg

您的重构代码中有错误。1不被提供作为第五参数来mktime但作为第三参数,以date这不会产生预期的结果
埃贾兹

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 liket”等加重字符来显示
Roubi

2
@Roubi由于utf8_encode被记录为“将ISO-8859-1字符串编码为UTF-8”,这意味着您的û是ISO-8859-1。如果您到处都需要UTF-8(并且您的PHP代码默认不在UTF-8中运行),则可以在setlocale中使用LC_ALL而不是LC_TIME。
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.通过使用createFromFormat()创建php日期对象

代码示例

$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

如果您有月份号,则可以首先从中创建一个日期,默认日期为1st,默认年份为当年,然后从创建的日期中提取月份名称:

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');
 ?>

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

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. 2015年

我猜想可以完成,主要是个人选择,我发现是否易于阅读,只有12个选项,任何速度差异都可以忽略不计。
古怪的海龟

如果您有基于多语言的网站
无效

不,但是您可以用返回以您选择的语言返回月份的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.如果要在1月,2月和3月获得结果,则尝试在日期下面的'M'作为参数的以下项。

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

输出:5月

/ 2。您可以使用'F'而不是'M'来获取完整的月份名称,作为输出1月2月3月等。

$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()预期是儒略日,这是天文学中使用的天数的递增计数。第0天是公元前4713年1月1日,第1天是公元前4713年1月2日,依此类推。2014年10月20日(作为公历)是儒略日2456951(作为儒略的日期是2014年10月7日)。PHP奇怪的是似乎无法正确处理0 Julian Day:echo jdtojulian(0)。“ <br/>”; 回声jdtojulian(1)。“ <br/>”; echo jdtojulian(2)。“ <br/>”; 返回:0/0/0 1/2 / -4713 1/3 / -4713
George Langley

-3

您可以只在SQL中使用monthname()函数。

从表组中按月名(date_column)选择月名(date_column)


1.)询问了PHP,而不是SQL。2.)您的回答似乎是MySQL特定的,而不是一般的SQL。
martti
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.