【问题标题】:Convert number to month name in PHP在 PHP 中将数字转换为月份名称
【发布时间】:2013-08-30 07:58:40
【问题描述】:

我有这个 PHP 代码:

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

echo $monthName;

但它返回的是 December 而不是 August

$result["month"] 等于 8,所以sprintf 函数添加了一个0 使其成为08

【问题讨论】:

  • 除非您将其转换为完整日期 (08-21-2013),或者与日期非常相似的日期 strtotime 不知道您要做什么。或者,只需使用开关即可。
  • 抱歉 - $result["month"] 是 8,因为我有一个 SQL 查询说 select MONTH(date time) from table... 所以在表中它是完整的日期格式跨度>
  • 但是strtotime 不知道“8”是什么意思。 strtotime 解析完整的时间戳,例如“2012-05-12 08:43:12”。在这种情况下,“8”是什么意思?
  • 为什么不直接:echo date( "F", time() );?例如,echo date( "F", strtotime("2019-03-09") ); 将输出“三月”

标签: php date


【解决方案1】:

您需要使用strtotimemktime 设置字段

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

mktime 仅设置月份。试试这个:

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

【讨论】:

    【解决方案2】:

    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。如果您没有设置日期(第 5 个参数),mktime 将使用当前日期。今天是 31 号。 2月31日是什么日子? :)
    • 您的重构代码有错误。 1 不是作为 mktime 的第 5 个参数提供的,而是作为 date 的第 3 个参数提供的,这不会产生预期的结果
    【解决方案3】:

    正因为大家都在使用strtotime()和date()函数,我就展示DateTime例子:

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

    【讨论】:

    • 或者,您可以使用DateTime::createFromFormat('m|', $result['month']); 仅重置缺失的字段。
    • 有没有办法使用这个解决方案来改变语言?
    • @MichelAyres:不。为此,您必须使用strftime()
    【解决方案4】:

    推荐的方法:

    如今,您确实应该将 DateTime 对象用于任何日期/时间数学。这要求您的 PHP 版本 >= 5.2。如Glavić's answer所示,可以使用如下:

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

    ! formatting character 用于将所有内容重置为Unix epochm 格式字符是月份的数字表示,带有前导零。

    替代解决方案:

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

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

    如果您想要像 Mar 这样的 3 个字母的月份名称,请将 F 更改为 M。在the PHP manual documentation 中可以找到所有可用格式选项的列表。

    【讨论】:

    • 这不尊重 LC_TIME 语言环境,并且总是以英文输出月份名称。
    • 我从未在 SO 上看到过这个 - 致命错误:从 48 个加号中调用 Noone 中的非对象上的成员函数 format() 没有这个?
    • 你为什么说我们“应该”为此使用 DateTime 对象? DateTime 对象很有用,但 date() 函数要简单得多,因为开销要低得多(在速度和内存方面),如果您要做的只是像这样简单的话。
    • @orrd:如果 date() 和 DateTime 之间的速度差异成为您正在构建的应用程序的瓶颈,我会说您需要担心更大的问题。对于实际应用程序,您不可避免地需要对日期执行其他操作,那么将其放在对象中会更好,因为它具有更易于阅读的 API。
    • @orrd:仅仅暗示 DateTime 值得一票否决,有点惊讶:P 对 DRY 来说太多了:artima.com/intv/dry.html
    【解决方案5】:

    使用mktime():

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

    参见 PHP 手册:http://php.net/mktime

    【讨论】:

    • 通过月份名称时有没有办法获取月份编号?
    • @Nisha 使用参数 "m" 它将以 2 位数字的形式返回月份作为 string。例如一月 = 01,二月 = 02
    【解决方案6】:

    要根据当前语言环境进行转换,您可以使用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 由于 utf8_encode 被记录为“将 ISO-8859-1 字符串编码为 UTF-8”,这意味着您的 û 是 ISO-8859-1。如果您希望在任何地方都使用 UTF-8(并且您的 PHP 代码默认不会在 UTF-8 中运行),您可以在 setlocale 中使用 LC_ALL 而不是 LC_TIME。
    【解决方案7】:

    如果您只想要从年初到年底的月份名称数组,例如要填充下拉选择,我只需使用以下内容;

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

    【讨论】:

      【解决方案8】:

      我认为使用 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"
      

      docs for cal_info()

      【讨论】:

        【解决方案9】:

        用途:

        $name = jdmonthname(gregoriantojd($monthNumber, 1, 1), CAL_MONTH_GREGORIAN_LONG);
        

        【讨论】:

          【解决方案10】:

          我想每个寻找这个答案的人可能只是想避免写出整个 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";
              }
          }
          

          【讨论】:

          • 你为什么不用switch/case?
          • 我猜可以做到,主要是个人选择,我发现 if/else 更容易阅读,并且只有 12 个选项,任何速度差异都可以忽略不计。
          • 如果您有基于多语言的网站,这将不起作用
          • 不,但您可以用 i18n 函数替换返回的字符串,这些函数以您选择的语言返回月份
          【解决方案11】:

          根据需要调整

          $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];
          

          【讨论】:

          • 简单明了,没有不必要的日期转换。
          【解决方案12】:

          这很简单,为什么这么多人提出如此糟糕的建议? @Bora 是最接近的,但这是最强大的

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

          这就是方法

          【讨论】:

            【解决方案13】:

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

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

            此代码假定您将月份编号存储在 $i 中

            【讨论】:

            • 最简单直接的解决方案。
            【解决方案14】:

            我目前正在使用以下解决方案来解决相同的问题:

            //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 try : utf8_encode(ucfirst(strftime("%B", strtotime($date))));
            • @Mimouni 这不是必需的,因为 utf8_encode 函数将 ISO-8859-1 字符串转换为 UTF-8,但是通过 LC_ALL,可以指示代码输出 UTF-8,例如,如果您使用 en_US.UTF-8 而不是 US。
            【解决方案15】:
            $monthNum = 5;
            $monthName = date("F", mktime(0, 0, 0, $monthNum, 10));
            

            我在 https://css-tricks.com/snippets/php/change-month-number-to-month-name/ 上找到了这个,它运行良好。

            【讨论】:

              【解决方案16】:

              有很多方法可以从给定的数字打印一个月。为您挑选一间套房。

              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
              

              【讨论】:

                【解决方案17】:

                这可以满足日期时间转换的所有需求

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

                【讨论】:

                  【解决方案18】:

                  只需一行即可完成:

                  DateTime::createFromFormat('!m', $salary->month)->format('F'); //April
                  

                  【讨论】:

                    【解决方案19】:

                    我就是这样做的

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

                    【讨论】:

                      【解决方案20】:

                      这里有一个简单的技巧,您可以根据需要使用 strtotime() 函数,将数字转换为月份名称。

                      1.如果你想要一月、二月和三月的结果然后尝试下面的一个,在日期内使用“M”作为参数。

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

                      输出:五月

                      /2。您可以尝试使用“F”而不是“M”来获取完整月份名称作为输出 January February March 等。

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

                      输出:一月

                      【讨论】:

                        【解决方案21】:
                        $days = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
                        $month = ( date('m') < 10 ) ? date('m')[1] : date('m');
                        

                        提取月份。

                        【讨论】:

                          猜你喜欢
                          • 2011-06-04
                          • 1970-01-01
                          • 2012-08-07
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-11-26
                          • 2011-03-18
                          相关资源
                          最近更新 更多