Converter número em nome do mês em PHP


152

Eu tenho este código PHP:

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

echo $monthName;

Mas está voltando Decemberantes August.

$result["month"]é igual a 8, então a sprintffunção está adicionando a 0para torná-lo 08.


6
A menos que você converta isso para uma data completa (21/08/2013), ou algo que se assemelhe a uma data strtotime, não tem idéia do que você está tentando fazer. Como alternativa, basta usar uma opção para algo assim.
Phpisuber01

desculpe - a $ result [ "mês"] é de 8, porque eu tenho uma consulta SQL que diz escolha o mês (data e hora) da tabela ... então na tabela é um formato de data completa
user2710234

1
Mas strtotimenão tem idéia do que "8" significa. strtotimeanalisa timestamps completos como "2012-05-12 08:43:12". O que "8" significa neste contexto?
deceze

por que não apenas echo date( "F", time() );:? Por exemplo, echo date( "F", strtotime("2019-03-09") );a saída será "March"
Rob Watts

Respostas:


357

A maneira recomendada de fazer isso:

Atualmente, você realmente deve usar objetos DateTime para qualquer matemática de data / hora. Isso requer que você tenha uma versão PHP> = 5.2. Conforme mostrado na resposta de Glavić , você pode usar o seguinte:

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

O !caractere de formatação é usado para redefinir tudo para a época do Unix . O mcaractere de formato é a representação numérica de um mês, com zeros à esquerda.

Solução alternativa:

Se você estiver usando uma versão mais antiga do PHP e não puder atualizar no momento, poderá usar esta solução. O segundo parâmetro da date()função aceita um registro de data e hora e você pode usar mktime()para criar um, assim:

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

Se você quiser o nome do mês com três letras Mar, mude Fpara M. A lista de todas as opções de formatação disponíveis pode ser encontrada na documentação do manual do PHP .


36
Isso não respeita o código do idioma LC_TIME e sempre gera o nome do mês em inglês.
Dereckson 28/08/14

2
Eu nunca vi isso no SO - Erro fatal: Chamar para um formato de função de membro () em um não-objeto no Noone de 48 vantagens não tinha isso?
Jaroslav Štreit

1
Por que você diz que "deveríamos" realmente estar usando objetos DateTime para isso? Os objetos DateTime são úteis, mas a função date () é muito mais simples, pois possui uma sobrecarga muito menor (em termos de velocidade e memória) se tudo o que você está tentando fazer é algo simples assim.
orrd

4
@orrd: Se a diferença de velocidade entre date () e DateTime for o gargalo do aplicativo que você está criando, eu diria que você tem problemas maiores com que se preocupar. Para aplicativos reais, onde você inevitavelmente precisará fazer outras coisas com as datas, a inclusão de um objeto em um objeto é superior, pois possui uma API mais fácil de ler.
Amal Murali

1
@orrd: kinda surpreendeu apenas sugerindo DateTime garante um downvote: P Tanto para DRY: artima.com/intv/dry.html
Amal Murali

42

Só porque todo mundo está usando as funções strtotime () e date (), mostrarei o exemplo DateTime :

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

Como alternativa, você pode DateTime::createFromFormat('m|', $result['month']);redefinir apenas os campos ausentes.
nullability

Existe uma maneira de mudar o idioma usando esta solução?
Michel Ayres

@MichelAyres: Não. Você terá que usar strftime()para isso.
Amal Murali

30

Use mktime():

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

Veja o manual do PHP: http://php.net/mktime


Existe alguma maneira de obter o número do mês quando o nome do mês é passado?
Nisha

@Nisha use paramter "m" ele retornará o mês como um número de 2 dígitos como a string. por exemplo, janeiro = 01, fevereiro = 02
Zac

18

strtotime espera um formato de data padrão e transmite um carimbo de data e hora.

Você parece estar passando strtotimeum único dígito para gerar um formato de data.

Você deve usar o mktimeque leva os elementos de data como parâmetros.

Seu código completo:

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

echo $monthName;

No entanto, a função mktime não requer um zero inicial para o número do mês, portanto, a primeira linha é completamente desnecessária e $result["month"]pode ser passada diretamente para a função.

Tudo isso pode ser combinado em uma única linha, ecoando a data em linha.

Seu código refatorado:

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

...


Estranhamente date("F", mktime(null, null, null, 2));retorna em Marchvez de February.
precisa

4
Bem notado, @Mischa. Se você não definir um dia (o quinto parâmetro), mktimeusará o dia atual. Hoje é dia 31. O que é o 31 de fevereiro? :)
Greg

Há um erro no seu código refatorado. 1não está sendo fornecido como 5 parâmetro para mktimemas como 3ª parâmetro para dateresultados que não produziria esperados
Ejaz

18

Para fazer a conversão em relação à localidade atual, você pode usar a strftimefunção:

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

datenão respeita a localidade, strftimefaz.


Obrigado, trabalhando bem! No entanto, eu tive que usar $monthName = utf8_encode(strftime('%B', mktime(0, 0, 0, $monthNumber)));para exibir caracteres acentuados como em 'Août'
Roubi

2
@Roubi Como utf8_encode está documentado como "Codifica uma string ISO-8859-1 para UTF-8", significa que seu û era um ISO-8859-1. Se você deseja UTF-8 em qualquer lugar (e seu código PHP não é executado por padrão no UTF-8), você pode usar LC_ALL em vez de LC_TIME em setlocale.
Dereckson

6

Se você deseja apenas uma matriz de nomes de meses do início ao ano, por exemplo, para preencher uma seleção suspensa, eu usaria o seguinte;

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

6

Existem várias maneiras de imprimir um mês a partir do número fornecido. Escolha uma suíte para você.

1. função date () junto com o parâmetro 'F'

Exemplo de código:

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

2. Criando o objeto php date usando createFromFormat ()

Exemplo de código

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

3. função strtotime ()

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

4. função mktime ()

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

5. Usando jdmonthname ()

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

4

adaptar conforme necessário

$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
Simples e direto ao ponto, sem conversões desnecessárias de datas.
martti 04/04

4

Se você tiver o número do mês, poderá criar uma data a partir dele com uma data padrão do 1º e ano padrão do ano atual e extrair o nome do mês da data criada:

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

Este código pressupõe que você tenha o número do seu mês armazenado em $ i

Espero que isso ajude alguém



2

isso é trivialmente fácil, por que tantas pessoas estão fazendo sugestões tão ruins? @Bora foi o mais próximo, mas este é o mais robusto

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

É assim que se faz


2

Atualmente, estou usando a solução abaixo para resolver o mesmo problema:

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

Para ler mais sobre o conjunto de códigos de idioma, acesse http://php.net/manual/en/function.setlocale.php

Para saber mais sobre o strftime, acesse http://php.net/manual/en/function.strftime.php

Ucfirst() é usado para colocar em maiúscula a primeira letra em uma sequência.


para compatibilidade com utf8, tente: utf8_encode (ucfirst (strftime ("% B", strtotime ($ date))));
Mimouni

1
@Mimouni Isso não é necessário, pois a função utf8_encode converte as seqüências ISO-8859-1 em UTF-8, mas através de LC_ALL, o código pode ser instruído para a saída de UTF-8, por exemplo, se você usar en_US.UTF-8 em vez de NOS.
Dereckson

2

Apenas uma linha

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

1

Você precisa definir campos com strtotimeoumktime

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

Com mktimeset apenas mês. Tente este:

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


1

Isso para todas as necessidades de conversão de data e hora

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

Eu acho que usar cal_info () é a maneira mais fácil de converter de número para 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"

Veja os documentos para cal_info ()



0

Eu sei que essa pergunta foi feita há um tempo, mas imaginei que todos que procuravam essa resposta provavelmente tentavam evitar escrever todas as instruções if / else, por isso escrevi para você para que você possa copiar / colar. A única ressalva com esta função é que ela continua no número real do mês, não no número indexado 0, então janeiro = 1, não 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
Por que você não usou switch / case?
Artjom B.

Poderia ter feito, eu acho, escolha pessoal principalmente, acho que / mais fácil de ler, e com apenas 12 opções, quaisquer diferenças de velocidade serão desprezíveis.
Freaky Turtle

isso não funciona se você tiver um site baseado em vários idiomas
Crustamet 18/06

Não, mas você pode substituir as strings retornadas pelas funções i18n que retornam o mês no idioma escolhido
Freaky Turtle

0

Para obter o nome do mês fornecendo o número do mês

$ month_number = 5;

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

Onde 'F' retornará o nome do mês, por exemplo. 'Posso'


0

Foi assim que eu fiz

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

retorna 30 June 2019


0

Um truque simples aqui, você pode usar a função strtotime () viável conforme sua necessidade, um número de conversão para o nome do mês.

1.Se você deseja um resultado em janeiro, fevereiro e março, tente abaixo de um com o 'M' como parâmetro dentro da data.

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

Saída: maio

/ 2 Você pode tentar com o 'F' em vez de 'M' para obter o nome completo do mês como uma saída janeiro fevereiro março etc.

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

Saída: janeiro


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

Isso extrai os meses.


-3

Use uma função nativa como jdmonthname():

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);

jdmonthname(3, CAL_MONTH_GREGORIAN_LONG);retornaNovember
Onimusha 14/05

jdmonthname () espera um dia juliano, que é uma contagem incremental de dias usados ​​em astronomia. O dia 0 foi 01 de janeiro de 4713 aC, o dia 1 foi 02 de janeiro de 4713 aC, etc. 20 de outubro de 2014 (como data gregoriana) é o dia juliano 2456951 (que como data juliana é 7 de outubro de 2014). Estranhamente, o PHP não parece lidar adequadamente com o 0 Julian Day: echo jdtojulian (0). "<br/>"; echo jdtojulian (1). "<br/>"; eco jdtojulian (2). "<br/>"; retorna: 0/0/0 1/2 / -4713 1/3 / -4713
George Langley

-3

Você pode apenas usar a função monthname () no SQL.

SELECT monthname (date_column) do grupo de tabelas por monthname (date_column)


1.) PHP foi solicitado, não SQL 2.) Sua resposta parece ser específica do MySQL, não SQL geral.
martti 04/04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.