PHPで数値を月名に変換する


152

私はこのPHPコードを持っています:

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

echo $monthName;

しかし、それDecemberはではなく戻ってきていAugustます。

$result["month"]は8に等しいので、sprintf関数は0それを作るためにa を追加してい08ます。


6
これを完全な日付(2013年8月21日)、または日付によく似たものに変換しない限り、何をしようとしているかわかりstrtotimeません。あるいは、このようなものにスイッチを使用するだけです。
phpisuber01 2013

申し訳ありません-$ result ["month"]は8です。これは、select MONTH(date time)from table ...と言うSQLクエリがあるため、テーブルでは完全な日付形式になります
user2710234

1
しかしstrtotime、「8」の意味がわかりません。strtotime「2012-05-12 08:43:12」のような完全なタイムスタンプを解析します。この文脈で「8」は何を意味しますか?
だます

なぜだけではないのecho date( "F", time() );ですか?たとえば、echo date( "F", strtotime("2019-03-09") );「3月」を出力します
Rob Watts

回答:


357

これを行うための推奨方法:

現在、日付/時刻の計算には、実際にはDateTimeオブジェクトを使用する必要があります。これには、PHPバージョン5.2以上が必要です。Glavićの回答に示されているように、以下を使用できます。

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

!文字書式はにすべてリセットするために使用されているUnixエポックをmフォーマット文字は、先頭のゼロで、月の数値表現です。

代替ソリューション:

古いバージョンのPHPを使用していて、現時点でアップグレードできない場合は、この解決策が考えられます。date()function の2番目のパラメーターはタイムスタンプを受け入れ、次のように使用mktime()してタイムスタンプを作成できます。

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

のような3文字の月名が必要なMar場合は、に変更FMます。使用可能なすべてのフォーマットオプションのリストは、PHPのマニュアルドキュメントに記載されています


36
これはLC_TIMEロケールを考慮せず、常に月名を英語で出力します。
デレクソン2014

2
私はSOでこれを見たことはありません-致命的なエラー:48プラスからのNooneの非オブジェクトでのメンバー関数format()の呼び出しにはこれがありませんでしたか?
JaroslavŠtreit2015年

1
このために「本当に」DateTimeオブジェクトを使用する必要があると言うのはなぜですか。DateTimeオブジェクトは便利ですが、date()関数は、このように単純なことをしようとすると、オーバーヘッドが(速度とメモリの両方の点で)低くなるため、はるかに単純になります。
Orrd

4
@orrd:date()とDateTimeの間の速度の違いが、作成しているアプリケーションのボトルネックであることが判明した場合、心配する必要のあるより大きな問題があると思います。実際のアプリケーションでは、必然的に日付を使用して他のことを行う必要があり、それをオブジェクト内に置くと、APIが読みやすくなるため優れています。
Amal Murali 2016年

1
@orrd:DateTimeが単に反対投票を正当化することを示唆しているだけで驚いた:PRY
Amal Murali

42

誰もがstrtotime()およびdate()関数を使用しているからといって、DateTimeの例を示します。

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

または、を使用DateTime::createFromFormat('m|', $result['month']);して、欠落しているフィールドのみをリセットできます。
nullability 2014年

このソリューションを使用して言語を変更する方法はありますか?
ミシェルエアーズ2014年

@MichelAyres:いいえ。strftime()そのために使用する必要があります。
Amal Murali 2014年

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ます。例:1月= 01、2月= 02
Zac

18

strtotime 標準の日付形式を想定し、タイムスタンプを返します。

strtotime日付形式を出力するために1桁を渡しているようです。

mktimeパラメータとして日付要素を取るwhichを使用する必要があります。

あなたの完全なコード:

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

echo $monthName;

ただし、mktime関数では月数の先頭にゼロを付ける必要がないため、最初の行は完全に不要であり$result["month"]、関数に直接渡すことができます。

次に、これをすべて1行に結合して、インラインで日付をエコーできます。

リファクタリングされたコード:

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日は何ですか?:)
グレッグ

リファクタリングされたコードにエラーがあります。1は5番目のパラメーターとして提供されていませんmktimeが、3番目のパラメーターとして提供されているdateため、期待どおりの結果が得られません
Ejaz

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ût」のようなアクセントのある文字を表示するために使用する必要がありました
Roubi

2
@Roubi utf8_encodeは「ISO-8859-1文字列をUTF-8にエンコードする」と文書化されているため、yourがISO-8859-1であったことを意味します。すべての場所でUTF-8が必要な場合(およびPHPコードがデフォルトでUTF-8で実行されない場合)、setlocaleでLC_TIMEの代わりにLC_ALLを使用できます。
デレクソン2018年

6

年の初めから終わりまでの月の名前の配列だけが必要な場合、たとえばドロップダウン選択を設定するには、次のようにします。

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

6

与えられた数から月を印刷する多くの方法があります。1つのスイートを選択してください。

1.パラメータ「F」と一緒のdate()関数

コード例:

$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
シンプルで、不必要な日付の変換がなくても十分です。
マルティ

4

月番号がある場合は、最初に日付を作成して、デフォルトの日付を1年、デフォルトの年を現在の年とし、作成した日付から月の名前を抽出します。

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を使用して、たとえば、代わりにen_US.UTF-8を使用する場合、コードにUTF-8を出力するように指示できます。我ら。
デレクソン2018年


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


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の数値ではなく、実際の月の数に適用されることです。そのため、0ではなく1月= 1になります。

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.

個人的な選択であると思いますが、ほとんどの場合、読みやすいかどうかがわかります。12のオプションしかないため、速度の違いは無視できます。
Freaky Turtle

多言語ベースのウェブサイトがある場合、これは機能しません
クラスタメット

いいえ、返された文字列は、選択した言語で月を返す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.Jan、Feb、Marの結果が必要な場合は、日付内のパラメーターとして「M」を使用して、以下を試してください。

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

出力:5月

/ 2。「M」の代わりに「F」を使用して、完全な月の名前を1月、2月、3月などの出力として取得できます。

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

出力:1月


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

それは月を抽出します。


-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日でした。PHPが奇妙なことに0ジュリアンデーを適切に処理しないようです:echo jdtojulian(0)。 "<br/>"; echo jdtojulian(1)。 "<br/>"; echo jdtojulian(2)。 "<br/>"; 戻り値:0/0/0 1/2 / -4713 1/3 / -4713
ジョージラングレー

-3

SQLでmonthname()関数を使用できます。

月名(date_column)によるテーブルグループから月名(date_column)を選択します


1.)SQLではなくPHPが要求された。2.)答えは、一般的なSQLではなく、MySQL固有のようです。
マルティ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.