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.

user2710234
fonte
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 .

Amal Murali
fonte
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');
Glavić
fonte
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

mintedsky
fonte
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));

...

Greg
fonte
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.

Dereckson
fonte
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"));
}
Trent Renshaw
fonte
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
Nishad Up
fonte
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];
zzapper
fonte
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

Bryan Itur
fonte
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

Heelis
fonte
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.

Cristo Rutazihana
fonte
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
Kaushik shrimali
fonte
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));
Bora
fonte
1
date("F", strtotime($result["month"]))

use o código acima

Visakh B Sujathan
fonte
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');
 ?>
imtaher
fonte
1
<?php
$month =1;
$convert =DateTime::createFromFormat('!m', $month);
echo $convert->format('F');
?>
Manjeet Kumar Nai
fonte
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 ()

boomx09
fonte
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";
    }
}
Tartaruga Muito Louca
fonte
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'

Bijendra Sahu
fonte
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

Vicky Salunkhe
fonte
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

Avinash Raut
fonte
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.

Geovany Quissanga
fonte
-3

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

echo jdmonthname($monthNum, CAL_MONTH_GREGORIAN_LONG);
Tonin Bolzan
fonte
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)

Sony Krishna Swamy
fonte
1.) PHP foi solicitado, não SQL 2.) Sua resposta parece ser específica do MySQL, não SQL geral.
martti 04/04