PHPはWebアプリケーション開発において非常に強力な言語であり、日付と時間の処理はその中でも重要な要素の一つです。
-
Webアプリケーションにおける日付処理の必要性: 多くのWebアプリケーションでは、イベントのスケジュール管理、記事の投稿日時表示、ユーザー登録日の記録、期限付きタスクの管理など、さまざまな場面で日付と時間を扱う必要があります。
-
日付処理の正確性と重要性: 日付の処理が不正確だと、誤った情報をユーザーに表示したり、重要な処理が正しく実行されなかったりする可能性があります。例えば、誤った日付に基づいて請求処理が行われたり、予約システムでダブルブッキングが発生したりすることが考えられます。
-
PHPが提供する日付処理関数: PHPには、
date()
、strtotime()
、DateTime
クラスなど、日付と時間を扱うための豊富な関数とクラスが用意されています。これらの機能を適切に利用することで、複雑な日付処理も効率的に行うことができます。特に文字列を日付に変換する処理は、外部データやユーザー入力など様々なデータソースから日付データを取り扱う場合に必須となります。 -
本記事の目的: 本記事では、PHPにおける文字列から日付への変換に焦点を当て、
date()
関数とstrtotime()
関数を中心とした具体的な方法を解説します。様々な日付形式に対応し、エラー処理やタイムゾーンの考慮など、実践的な知識を習得することで、PHPでの日付処理能力を向上させましょう。
date()
関数は、PHPで日付と時刻を指定された形式でフォーマットするために使用されます。この関数は、タイムスタンプ(Unixエポックからの秒数)に基づいて文字列を生成します。
date()
関数の基本的な構文は以下の通りです。
string date ( string $format [, int $timestamp = time() ] )
-
$format
: 必須。日付と時刻のフォーマットを指定する文字列。 -
$timestamp
: オプション。フォーマットするタイムスタンプ。省略された場合は、現在の時刻が使用されます。
$format
パラメータには、日付と時刻の表示形式を定義する様々な文字(フォーマット文字)を使用できます。以下は、よく使用されるフォーマット文字の例です。
フォーマット文字 | 説明 | 例 |
---|---|---|
Y |
4桁の年 | 2023 |
y |
2桁の年 | 23 |
m |
数字で表される月 (先頭にゼロが付く) | 01 – 12 |
n |
数字で表される月 (先頭のゼロは付かない) | 1 – 12 |
d |
日(先頭にゼロが付く) | 01 – 31 |
j |
日(先頭のゼロは付かない) | 1 – 31 |
H |
24時間形式の時(先頭にゼロが付く) | 00 – 23 |
h |
12時間形式の時(先頭にゼロが付く) | 01 – 12 |
i |
分(先頭にゼロが付く) | 00 – 59 |
s |
秒(先頭にゼロが付く) | 00 – 59 |
w |
曜日(0=日曜日, 6=土曜日) | 0 – 6 |
l |
曜日(英語のフルスペル) | Sunday – Saturday |
F |
月(英語のフルスペル) | January – December |
これらのフォーマット文字を組み合わせることで、さまざまな形式で日付と時刻を表示できます。
<?php
// 現在の日付をYYYY-MM-DD形式で表示
echo date("Y-m-d"); // 例:2023-10-27
// 現在の日付と時刻をYYYY/MM/DD HH:MM:SS形式で表示
echo date("Y/m/d H:i:s"); // 例:2023/10/27 10:30:00
// タイムスタンプを指定して日付をフォーマット
$timestamp = strtotime("2024-01-01");
echo date("Y年m月d日", $timestamp); // 例:2024年01月01日
?>
date()
関数を使用することで、Webアプリケーションで必要となるさまざまな形式で日付と時刻を表示できます。
strtotime()
関数は、人間が読める形式の日付文字列をUnixタイムスタンプ(1970年1月1日 00:00:00 UTC からの経過秒数)に変換するために使用されます。これは、データベースに日付を保存したり、日付計算を行う場合に非常に便利です。
strtotime()
関数の基本的な構文は以下の通りです。
int strtotime ( string $datetime [, int $now = time() ] )
-
$datetime
: 必須。解析する日付/時刻文字列。 -
$now
: オプション。タイムスタンプの計算基準となる日時を指定します。省略された場合は、現在の時刻が使用されます。
strtotime()
関数は、様々な日付と時刻の形式を理解できます。以下は、strtotime()
関数が解釈できる一般的な文字列の例です。
-
"now"
: 現在の時刻 "10 September 2000"
"next Monday"
"+1 week"
"+1 week 2 days 4 hours 2 seconds"
"last Monday"
"tomorrow"
"yesterday"
"2023-10-27"
"10/27/2023"
strtotime()
関数は、英語で記述された日付や時刻の表現も理解できます。
<?php
// 現在の日付のタイムスタンプを取得
$timestamp_now = strtotime("now");
echo "現在のタイムスタンプ: " . $timestamp_now . "\n";
// 明日の日付のタイムスタンプを取得
$timestamp_tomorrow = strtotime("tomorrow");
echo "明日のタイムスタンプ: " . $timestamp_tomorrow . "\n";
// 特定の日付のタイムスタンプを取得
$timestamp_date = strtotime("2023-12-25");
echo "2023-12-25のタイムスタンプ: " . $timestamp_date . "\n";
// 相対的な日付のタイムスタンプを取得
$timestamp_next_week = strtotime("+1 week");
echo "来週の今日のタイムスタンプ: " . $timestamp_next_week . "\n";
// エラー処理: 解析できない文字列を渡した場合
$timestamp_invalid = strtotime("invalid date string");
if ($timestamp_invalid === false) {
echo "無効な日付文字列です\n";
}
?>
-
strtotime()
関数は、解析に失敗した場合にfalse
を返します。そのため、必ず返り値がfalse
でないことを確認する必要があります。 -
strtotime()
関数は、様々な日付形式を解釈できますが、一貫性のある形式で日付文字列を使用することをお勧めします。特に、日付の区切り文字(/
や-
)や年の表現(2桁または4桁)に注意してください。 - タイムゾーンの設定によって、
strtotime()
関数の結果が異なる場合があります。
strtotime()
関数を使用することで、人間が読みやすい形式の日付文字列を簡単にタイムスタンプに変換し、日付処理を柔軟に行うことができます。
strtotime()
関数で文字列をタイムスタンプに変換し、そのタイムスタンプをdate()
関数に渡すことで、任意の形式で日付文字列を表示できます。この組み合わせは、異なる形式の日付文字列を統一的な形式に変換したり、日付の計算結果を表示したりする際に非常に強力です。
-
文字列を
strtotime()
関数でタイムスタンプに変換する:まず、変換したい日付文字列を
strtotime()
関数に渡して、Unixタイムスタンプを取得します。$date_string = "2023-11-05"; $timestamp = strtotime($date_string);
-
タイムスタンプを
date()
関数でフォーマットする:次に、取得したタイムスタンプを
date()
関数に渡して、希望する形式で日付を表示します。$formatted_date = date("Y/m/d", $timestamp); // "2023/11/05" echo $formatted_date;
<?php
// 異なる形式の日付文字列を変換する
$date_string1 = "October 27, 2023";
$date_string2 = "2023/10/27";
$timestamp1 = strtotime($date_string1);
$timestamp2 = strtotime($date_string2);
echo date("Y-m-d", $timestamp1) . "\n"; // 2023-10-27
echo date("Y-m-d", $timestamp2) . "\n"; // 2023-10-27
// 相対的な日付を計算して表示する
$date_string = "now";
$timestamp = strtotime($date_string . "+1 week");
echo "来週の今日は " . date("Y年m月d日", $timestamp) . "です\n";
// エラー処理
$invalid_date = "invalid date";
$timestamp = strtotime($invalid_date);
if ($timestamp === false) {
echo "無効な日付文字列です\n";
} else {
echo date("Y-m-d", $timestamp);
}
?>
strtotime()
関数は柔軟な日付形式に対応していますが、予期せぬ結果を避けるためには、日付形式を統一することが重要です。例えば、"01/02/2023"
という文字列は、ロケールによっては「2023年1月2日」または「2023年2月1日」と解釈される可能性があります。このような曖昧さを解消するために、日付形式を明示的に指定するか、DateTime
クラスを使用することを検討してください(後述)。
PHP 5.2以降では、DateTime
クラスを使用することで、より高度な日付処理が可能になります。DateTime
クラスは、日付オブジェクトを生成し、さまざまな操作を行うためのメソッドを提供します。
<?php
$date_string = "October 27, 2023";
$date = new DateTime($date_string);
echo $date->format("Y-m-d"); // 2023-10-27
?>
DateTime
クラスを使用することで、タイムゾーンの扱い、日付の計算、比較など、より複雑な日付処理をより安全かつ効率的に行うことができます。 DateTime
クラスについては、今後のセクションで詳しく説明します。
PHPのDateTime
クラスは、様々な形式の日付文字列を柔軟に日付オブジェクトに変換するための強力なツールです。 strtotime()
関数よりもより厳密な解析が可能で、より複雑な日付処理に適しています。
DateTime
クラスは、日付と時刻を表すオブジェクトを生成し、操作するための機能を提供します。日付のフォーマット、計算、比較など、様々な操作をメソッドを通じて行うことができます。
-
DateTimeオブジェクトの生成:
DateTime
コンストラクタに日付文字列を渡すことで、DateTime
オブジェクトを生成できます。$date_string = "2023-11-05"; $date = new DateTime($date_string);
-
日付のフォーマット:
format()
メソッドを使用して、日付オブジェクトを指定された形式の文字列に変換します。$formatted_date = $date->format("Y/m/d"); // "2023/11/05" echo $formatted_date;
DateTime::createFromFormat()
メソッドは、特定の日付形式を明示的に指定してDateTime
オブジェクトを生成する場合に非常に便利です。 これにより、曖昧な日付形式の解釈を防ぎ、より正確な変換を実現できます。
<?php
$date_string = "27.10.2023"; // ドイツ語形式の日付
$format = "d.m.Y"; // 日付形式を指定
$date = DateTime::createFromFormat($format, $date_string);
if ($date) {
echo $date->format("Y-m-d"); // 2023-10-27
} else {
echo "無効な日付形式です";
}
?>
この例では、"d.m.Y"
というフォーマットを指定することで、"27.10.2023"
が確実に「日.月.年」として解釈されるようにしています。
<?php
// 様々な日付形式の文字列
$date_strings = [
"2023-11-05",
"11/05/2023",
"November 5, 2023",
"05 Nov 2023",
"20231105" // YYYYMMDD形式
];
foreach ($date_strings as $date_string) {
try {
// まず、DateTimeオブジェクトを生成してみる
$date = new DateTime($date_string);
echo "文字列 '$date_string' は ";
echo $date->format("Y-m-d") . " に変換されました。\n";
} catch (Exception $e) {
// DateTimeコンストラクタでエラーが発生した場合 (例えば YYYYMMDD形式の場合)
if (preg_match('/^(\d{4})(\d{2})(\d{2})$/', $date_string, $matches)) {
// YYYYMMDD形式をDateTimeオブジェクトに変換
$year = $matches[1];
$month = $matches[2];
$day = $matches[3];
try {
$date = new DateTime("$year-$month-$day");
echo "文字列 '$date_string' (YYYYMMDD形式) は ";
echo $date->format("Y-m-d") . " に変換されました。\n";
} catch (Exception $e) {
echo "文字列 '$date_string' は変換できませんでした (YYYYMMDD形式も含む)。\n";
}
} else {
echo "文字列 '$date_string' は変換できませんでした。\n";
}
}
}
?>
この例では、DateTime
オブジェクトの生成をtry...catch
ブロックで囲むことで、エラーが発生した場合でも処理を継続できるようにしています。 また、特定の形式(YYYYMMDD)の日付文字列に対して、正規表現を使用して解析し、DateTime
オブジェクトを生成する例も示しています。
-
DateTime
コンストラクタは、解析できない文字列を渡された場合にException
をスローします。そのため、try...catch
ブロックで囲むことを推奨します。 -
createFromFormat()
メソッドを使用する場合は、日付文字列と形式が一致していることを確認してください。 -
DateTime
クラスを使用すると、タイムゾーンの扱いがより明確になります。タイムゾーンの設定については、今後のセクションで詳しく説明します。
DateTime
クラスとcreateFromFormat()
メソッドを使用することで、様々な日付形式の文字列を柔軟かつ正確に日付オブジェクトに変換し、Webアプリケーションで必要となる日付処理を安全に行うことができます。
Webアプリケーションで日付データを扱う際、ユーザーからの入力や外部データソースから取得した日付文字列が、必ずしも正しい形式であるとは限りません。不正な日付文字列をそのまま処理すると、エラーが発生したり、誤った情報が表示されたりする可能性があります。そのため、日付の検証とエラー処理は非常に重要です。
日付の検証を行うことで、以下の問題を未然に防ぐことができます。
-
プログラムのエラー: 不正な日付文字列を
strtotime()
やDateTime
コンストラクタに渡すと、エラーが発生してプログラムが停止する可能性があります。 - データベースの整合性: 不正な日付データをデータベースに保存すると、データの整合性が損なわれ、様々な問題を引き起こす可能性があります。
- 誤った情報の表示: 不正な日付に基づいて情報を表示すると、ユーザーに誤解を与えてしまう可能性があります。
PHPには、日付を検証するための様々な方法があります。
-
strtotime()
関数の利用:strtotime()
関数は、解析に失敗した場合にfalse
を返します。この性質を利用して、日付文字列が有効かどうかを簡単に確認できます。<?php $date_string = "invalid date"; $timestamp = strtotime($date_string); if ($timestamp === false) { echo "無効な日付文字列です"; } else { echo "有効な日付文字列です"; } ?>
-
DateTime::getLastErrors()
メソッドの利用:DateTime::createFromFormat()
メソッドを使用する場合、DateTime::getLastErrors()
メソッドを使用して、解析中に発生したエラーに関する情報を取得できます。<?php $date_string = "31.02.2023"; // 存在しない日付 $format = "d.m.Y"; $date = DateTime::createFromFormat($format, $date_string); if (!$date) { $errors = DateTime::getLastErrors(); echo "エラー:\n"; print_r($errors); } else { echo $date->format("Y-m-d"); } ?>
この例では、存在しない日付 “31.02.2023” を解析しようとしたため、エラーが発生し、エラー情報が表示されます。
-
正規表現による検証:
特定の日付形式を検証するために、正規表現を使用することができます。正規表現を使用すると、日付文字列が特定のパターンに一致するかどうかを厳密にチェックできます。
<?php $date_string = "2023-11-05"; $pattern = '/^\d{4}-\d{2}-\d{2}$/'; // YYYY-MM-DD形式の正規表現 if (preg_match($pattern, $date_string)) { echo "有効な日付形式です"; } else { echo "無効な日付形式です"; } ?>
日付の検証でエラーが検出された場合、適切なエラー処理を行う必要があります。
- エラーメッセージの表示: ユーザーにわかりやすいエラーメッセージを表示し、正しい形式で日付を入力するように促します。
- デフォルト値の使用: 無効な日付が入力された場合に、デフォルトの日付(例えば、現在の日付)を使用します。
- 処理の中止: 無効な日付が必須な場合、処理を中止してエラーログに記録します。
以下は、日付の検証とエラー処理を組み合わせた実践的な例です。
<?php
function validateDate($date, $format = 'Y-m-d') {
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
$date_string = $_POST['date']; // ユーザーからの日付入力
if (validateDate($date_string)) {
// 有効な日付の場合の処理
$date = new DateTime($date_string);
echo "日付は " . $date->format("Y年m月d日") . " です。\n";
} else {
// 無効な日付の場合のエラー処理
echo "無効な日付形式です。YYYY-MM-DD形式で入力してください。\n";
}
?>
この例では、validateDate()
関数を使用して、日付文字列がYYYY-MM-DD
形式で有効かどうかを検証しています。 無効な日付が入力された場合、ユーザーにエラーメッセージを表示しています。
日付の検証とエラー処理を適切に行うことで、Webアプリケーションの安定性と信頼性を向上させることができます。
ここでは、様々なシナリオにおける日付変換の具体的なサンプルコードを紹介します。これらの例を参考に、ご自身のWebアプリケーションで必要な日付処理を実装してみてください。
ユーザーが入力した誕生日(YYYY-MM-DD形式)を、YYYY年MM月DD日形式で表示する例です。
<?php
$birthday = $_POST['birthday']; // ユーザーが入力した誕生日(例:2000-01-01)
if (validateDate($birthday)) { // validateDate()関数は前述のセクションで定義
$date = new DateTime($birthday);
$formatted_birthday = $date->format("Y年m月d日");
echo "誕生日は " . $formatted_birthday . " です。\n";
} else {
echo "無効な日付形式です。YYYY-MM-DD形式で入力してください。\n";
}
?>
データベースに保存されているイベントの開催日(YYYY-MM-DD形式)を、”Month Day, Year”形式(例:October 27, 2023)で表示する例です。
<?php
$event_date = "2023-10-27"; // データベースから取得したイベント開催日
$date = new DateTime($event_date);
$formatted_event_date = $date->format("F j, Y"); // F: 月のフルスペル、j: 日(先頭のゼロなし)、Y: 4桁の年
echo "イベント開催日: " . $formatted_event_date . "\n";
?>
現在の日付から1週間後の日付を、YYYY-MM-DD形式で表示する例です。
<?php
$today = new DateTime(); // 現在の日付を取得
$next_week = $today->modify('+1 week'); // 1週間後の日付を計算
$formatted_next_week = $next_week->format("Y-m-d");
echo "1週間後の日付: " . $formatted_next_week . "\n";
?>
ユーザーが入力した日付が、特定の日付範囲内にあるかどうかを検証する例です。
<?php
$start_date = new DateTime("2023-01-01"); // 開始日
$end_date = new DateTime("2023-12-31"); // 終了日
$input_date_string = $_POST['date']; // ユーザーが入力した日付
if (validateDate($input_date_string)) { // validateDate()関数は前述のセクションで定義
$input_date = new DateTime($input_date_string);
if ($input_date >= $start_date && $input_date <= $end_date) {
echo "日付は範囲内にあります。\n";
} else {
echo "日付は範囲外です。\n";
}
} else {
echo "無効な日付形式です。YYYY-MM-DD形式で入力してください。\n";
}
?>
特定のタイムゾーンに基づいて日付をフォーマットする例です。
<?php
$date_string = "2023-10-27 10:00:00";
$timezone = new DateTimeZone('America/Los_Angeles'); // タイムゾーンをAmerica/Los_Angelesに設定
$date = new DateTime($date_string, $timezone);
echo "ロサンゼルスの日付: " . $date->format("Y-m-d H:i:s T") . "\n";
// 別のタイムゾーンに変換
$tokyo_timezone = new DateTimeZone('Asia/Tokyo');
$date->setTimezone($tokyo_timezone);
echo "東京の日付: " . $date->format("Y-m-d H:i:s T") . "\n";
?>
これらのサンプルコードは、日付変換の基本的な操作を理解するための出発点として役立ちます。 必要に応じて、これらの例をカスタマイズして、ご自身のWebアプリケーションで必要な日付処理を実装してください。 特に、ユーザー入力の検証とエラー処理は、Webアプリケーションのセキュリティと信頼性を確保するために不可欠です。
Webアプリケーションで日付と時刻を扱う際、タイムゾーンの設定と考慮は非常に重要です。特に、複数の国や地域で利用されるアプリケーションでは、タイムゾーンを適切に処理しないと、誤った日時が表示されたり、予期せぬ動作が発生したりする可能性があります。
タイムゾーンとは、地球上の特定の地域で共通して使用される標準時を指します。世界には様々なタイムゾーンが存在し、それぞれUTC(協定世界時)からのオフセットが異なります。例えば、日本はUTC+9、アメリカのロサンゼルスはUTC-8(標準時)またはUTC-7(夏時間)です。
PHPでは、タイムゾーンを以下の方法で設定できます。
-
date_default_timezone_set()
関数を使用する:date_default_timezone_set()
関数を使用すると、スクリプト全体のデフォルトタイムゾーンを設定できます。<?php date_default_timezone_set('Asia/Tokyo'); // タイムゾーンを東京に設定 echo date('Y-m-d H:i:s'); ?>
-
php.ini
ファイルで設定する:php.ini
ファイルのdate.timezone
ディレクティブを設定することで、PHP全体のデフォルトタイムゾーンを設定できます。date.timezone = Asia/Tokyo
-
DateTimeZone
クラスを使用する:DateTimeZone
クラスを使用すると、個々のDateTime
オブジェクトにタイムゾーンを設定できます。<?php $timezone = new DateTimeZone('America/Los_Angeles'); $date = new DateTime('now', $timezone); echo $date->format('Y-m-d H:i:s T'); // Tはタイムゾーンの略称を表示 ?>
Webアプリケーションでタイムゾーンを考慮する際には、以下の点に注意する必要があります。
-
ユーザーのタイムゾーンの取得:
ユーザーのタイムゾーンを特定する方法はいくつかあります。
- ユーザーにタイムゾーンを選択させる: ユーザーに明示的にタイムゾーンを選択させるフォームを作成します。
- IPアドレスから推定する: ユーザーのIPアドレスからタイムゾーンを推定するサービスを利用します(精度は保証されません)。
- ブラウザから取得する: JavaScriptを使用して、ブラウザからタイムゾーンを取得します。
-
日付と時刻の保存:
データベースに日付と時刻を保存する際には、UTCで保存することをお勧めします。これにより、タイムゾーンの違いによる問題を回避できます。
-
日付と時刻の表示:
日付と時刻をユーザーに表示する際には、ユーザーのタイムゾーンに基づいて表示する必要があります。
<?php // データベースからUTCで保存された日付を取得 $utc_date_string = "2023-10-27 10:00:00"; // ユーザーのタイムゾーンを取得(ここでは仮にAmerica/Los_Angelesとする) $user_timezone = new DateTimeZone('America/Los_Angeles'); // DateTimeオブジェクトを生成し、タイムゾーンを設定 $date = new DateTime($utc_date_string, new DateTimeZone('UTC')); $date->setTimezone($user_timezone); // ユーザーのタイムゾーンに基づいて日付を表示 echo "ユーザーの現地時間: " . $date->format('Y-m-d H:i:s T') . "\n"; ?>
夏時間(DST)は、一部の地域で実施されている制度で、夏季に時刻を1時間進めることで、日照時間を有効活用することを目的としています。夏時間を考慮する際には、DateTimeZone
クラスが自動的に夏時間を処理してくれるため、特に意識する必要はありません。
-
date_default_timezone_set()
関数は、スクリプトの実行中に何度も呼び出すと、予期せぬ動作が発生する可能性があります。 - タイムゾーンの設定を誤ると、日付と時刻の計算が正しく行われない可能性があります。
- タイムゾーンのデータベースは、定期的に更新されるため、最新の状態に保つようにしてください。
タイムゾーンの設定と考慮を適切に行うことで、グローバルなWebアプリケーションでも正確な日付と時刻を扱うことができます。
この記事では、PHPで日付文字列を扱うための様々な方法を解説しました。
-
date()
関数とstrtotime()
関数: 基本的な日付フォーマットとUnixタイムスタンプの変換について学びました。 -
DateTime
クラス: より高度な日付処理のためのDateTime
クラスの利用方法、特にcreateFromFormat()
メソッドによる厳密な形式指定について解説しました。 - 日付の検証とエラー処理: 不正な日付文字列に対する適切な対処法を学び、Webアプリケーションの堅牢性を高める方法を理解しました。
- 実践的なサンプルコード: 具体的なシナリオに基づいたサンプルコードを通じて、学んだ知識を応用する方法を習得しました。
- タイムゾーンの設定と考慮: グローバルなWebアプリケーション開発において不可欠な、タイムゾーンの適切な扱い方について学びました。
これらの知識を習得することで、あなたはPHPでの日付文字列変換を自信を持って行えるようになります。
-
PHPマニュアルの活用: PHPマニュアルは、
date()
関数、strtotime()
関数、DateTime
クラスの詳細な情報源です。常に最新の情報を参照し、理解を深めるようにしましょう。 - ライブラリの活用: Carbonなどの日付処理ライブラリは、PHPでの日付処理をさらに簡素化し、高度な機能を提供します。必要に応じて、これらのライブラリの利用を検討してみてください。
- 実践的な課題への挑戦: 実際にWebアプリケーションを開発し、日付処理に関する課題に挑戦することで、実践的なスキルを向上させることができます。
- セキュリティ対策の徹底: ユーザーからの入力や外部データソースから取得した日付データは、常に検証し、安全な形式に変換してから処理するように心がけましょう。
日付処理は、Webアプリケーション開発において頻繁に遭遇する課題の一つです。この記事で学んだ知識を基礎として、継続的に学習と実践を重ねることで、PHPでの日付文字列変換をマスターし、より高度なWebアプリケーション開発に挑戦していきましょう。
0件のコメント