2022年10月14日

日付と時刻

新しい組み込みオブジェクトであるDateについて学びましょう。これは日付と時刻を格納し、日付/時刻管理のためのメソッドを提供します。

たとえば、作成/変更時刻の保存、時間の測定、現在の日付の出力などに使用できます。

作成

新しいDateオブジェクトを作成するには、次のいずれかの引数を指定してnew Date()を呼び出します。

new Date()

引数なし - 現在の日付と時刻のDateオブジェクトを作成します。

let now = new Date();
alert( now ); // shows current date/time
new Date(milliseconds)

1970年1月1日UTC+0から経過したミリ秒数(1秒の1/1000)に等しい時刻を持つDateオブジェクトを作成します。

// 0 means 01.01.1970 UTC+0
let Jan01_1970 = new Date(0);
alert( Jan01_1970 );

// now add 24 hours, get 02.01.1970 UTC+0
let Jan02_1970 = new Date(24 * 3600 * 1000);
alert( Jan02_1970 );

1970年の初めから経過したミリ秒数を表す整数を、タイムスタンプと呼びます。

これは、日付を軽量な数値で表現したものです。 new Date(timestamp)を使用してタイムスタンプから日付を作成し、date.getTime()メソッドを使用して既存のDateオブジェクトをタイムスタンプに変換することができます(下記参照)。

1970年1月1日より前の日付は、負のタイムスタンプを持ちます。例:

// 31 Dec 1969
let Dec31_1969 = new Date(-24 * 3600 * 1000);
alert( Dec31_1969 );
new Date(datestring)

引数が1つで、それが文字列の場合、自動的に解析されます。アルゴリズムはDate.parseと同じです。後ほど説明します。

let date = new Date("2017-01-26");
alert(date);
// The time is not set, so it's assumed to be midnight GMT and
// is adjusted according to the timezone the code is run in
// So the result could be
// Thu Jan 26 2017 11:00:00 GMT+1100 (Australian Eastern Daylight Time)
// or
// Wed Jan 25 2017 16:00:00 GMT-0800 (Pacific Standard Time)
new Date(year, month, date, hours, minutes, seconds, ms)

ローカルタイムゾーンで指定されたコンポーネントを使用して日付を作成します。最初の2つの引数のみが必須です。

  • yearは4桁である必要があります。互換性のために、2桁も受け入れられ、19xxとみなされます。たとえば、ここでは981998と同じですが、常に4桁を使用することを強くお勧めします。
  • monthカウントは0(1月)から11(12月)までです。
  • dateパラメータは実際には日ですが、省略した場合は1とみなされます。
  • hours/minutes/seconds/msが省略されている場合、0とみなされます。

例えば

new Date(2011, 0, 1, 0, 0, 0, 0); // 1 Jan 2011, 00:00:00
new Date(2011, 0, 1); // the same, hours etc are 0 by default

最大の精度は1ミリ秒(1/1000秒)です。

let date = new Date(2011, 0, 1, 2, 3, 4, 567);
alert( date ); // 1.01.2011, 02:03:04.567

日付コンポーネントへのアクセス

Dateオブジェクトから年、月などにアクセスするためのメソッドがあります。

getFullYear()
年を取得します(4桁)。
getMonth()
月を取得します。0から11までです。
getDate()
1から31までの日を取得します。メソッドの名前は少し奇妙に見えます。
getHours()getMinutes()getSeconds()getMilliseconds()
対応する時間コンポーネントを取得します。
getYear()ではなく、getFullYear()を使用してください。

多くのJavaScriptエンジンは、非標準のメソッドであるgetYear()を実装しています。このメソッドは非推奨です。これは、2桁の年を返す場合があります。使用しないでください。年にはgetFullYear()があります。

さらに、曜日を取得できます。

getDay()
0(日曜日)から6(土曜日)までの曜日を取得します。最初の日曜日は常に日曜日です。国によってはそうではありませんが、変更することはできません。

上記のすべてのメソッドは、ローカルタイムゾーンに関連するコンポーネントを返します。

UTC+0タイムゾーンの日、月、年などを返すUTC対応のメソッドもあります:getUTCFullYear()getUTCMonth()getUTCDay()。「get」の直後に「UTC」を挿入するだけです。

ローカルタイムゾーンがUTCに対してずれている場合、以下のコードは異なる時間を表示します。

// current date
let date = new Date();

// the hour in your current time zone
alert( date.getHours() );

// the hour in UTC+0 time zone (London time without daylight savings)
alert( date.getUTCHours() );

上記のメソッドに加えて、UTCバリアントを持たない2つの特別なメソッドがあります。

getTime()

日付のタイムスタンプ(1970年1月1日UTC+0から経過したミリ秒数)を返します。

getTimezoneOffset()

UTCとローカルタイムゾーンの差を分単位で返します。

// if you are in timezone UTC-1, outputs 60
// if you are in timezone UTC+3, outputs -180
alert( new Date().getTimezoneOffset() );

日付コンポーネントの設定

次のメソッドを使用すると、日付/時刻コンポーネントを設定できます。

setTime()を除くすべてにUTCバリアントがあります。たとえば、setUTCHours()です。

ご覧のとおり、一部のメソッドは一度に複数のコンポーネントを設定できます。たとえば、setHoursです。言及されていないコンポーネントは変更されません。

例えば

let today = new Date();

today.setHours(0);
alert(today); // still today, but the hour is changed to 0

today.setHours(0, 0, 0, 0);
alert(today); // still today, now 00:00:00 sharp.

自動修正

自動修正は、Dateオブジェクトの非常に便利な機能です。範囲外の値を設定でき、自動的に調整されます。

例えば

let date = new Date(2013, 0, 32); // 32 Jan 2013 ?!?
alert(date); // ...is 1st Feb 2013!

範囲外の日付コンポーネントは自動的に配分されます。

日付「2016年2月28日」を2日増やす必要があるとします。うるう年の場合は「3月2日」または「3月1日」になる場合があります。それについて考える必要はありません。2日を追加するだけです。 Dateオブジェクトが残りを処理します。

let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);

alert( date ); // 1 Mar 2016

この機能は、指定された期間後の日付を取得するためによく使用されます。たとえば、「今から70秒後」の日付を取得してみましょう。

let date = new Date();
date.setSeconds(date.getSeconds() + 70);

alert( date ); // shows the correct date

ゼロまたは負の値を設定することもできます。例えば

let date = new Date(2016, 0, 2); // 2 Jan 2016

date.setDate(1); // set day 1 of month
alert( date );

date.setDate(0); // min day is 1, so the last day of the previous month is assumed
alert( date ); // 31 Dec 2015

日付を数値に変換、日付の差

Dateオブジェクトが数値に変換されると、date.getTime()と同じタイムスタンプになります。

let date = new Date();
alert(+date); // the number of milliseconds, same as date.getTime()

重要な副作用:日付を減算でき、結果はミリ秒単位の差になります。

これは、時間測定に使用できます。

let start = new Date(); // start measuring time

// do the job
for (let i = 0; i < 100000; i++) {
  let doSomething = i * i * i;
}

let end = new Date(); // end measuring time

alert( `The loop took ${end - start} ms` );

Date.now()

時間を測定したいだけなら、Dateオブジェクトは必要ありません。

現在のタイムスタンプを返す特別なメソッドDate.now()があります。

これはセマンティック的にはnew Date().getTime()と同じですが、中間Dateオブジェクトを作成しません。そのため、高速で、ガベージコレクションに負担をかけません。

これは、主に利便性のため、またはJavaScriptのゲームやその他の特殊なアプリケーションのようにパフォーマンスが重要な場合に使用されます。

そのため、おそらくこれが良いでしょう。

let start = Date.now(); // milliseconds count from 1 Jan 1970

// do the job
for (let i = 0; i < 100000; i++) {
  let doSomething = i * i * i;
}

let end = Date.now(); // done

alert( `The loop took ${end - start} ms` ); // subtract numbers, not dates

ベンチマーク

CPU負荷の高い関数の信頼性の高いベンチマークが必要な場合は、注意が必要です。

たとえば、2つの日付の差を計算する2つの関数を測定してみましょう。どちらが高速でしょうか?

このようなパフォーマンス測定は、しばしば「ベンチマーク」と呼ばれます。

// we have date1 and date2, which function faster returns their difference in ms?
function diffSubtract(date1, date2) {
  return date2 - date1;
}

// or
function diffGetTime(date1, date2) {
  return date2.getTime() - date1.getTime();
}

これら2つはまったく同じことを行いますが、一方ではミリ秒単位の日付を取得するために明示的なdate.getTime()を使用し、もう一方は日付から数値への変換に依存しています。結果は常に同じです。

では、どちらが高速でしょうか?

最初のアイデアは、それらを何度も連続して実行し、時間差を測定することかもしれません。私たちの場合、関数は非常に単純なので、少なくとも100000回実行する必要があります。

測定してみましょう。

function diffSubtract(date1, date2) {
  return date2 - date1;
}

function diffGetTime(date1, date2) {
  return date2.getTime() - date1.getTime();
}

function bench(f) {
  let date1 = new Date(0);
  let date2 = new Date();

  let start = Date.now();
  for (let i = 0; i < 100000; i++) f(date1, date2);
  return Date.now() - start;
}

alert( 'Time of diffSubtract: ' + bench(diffSubtract) + 'ms' );
alert( 'Time of diffGetTime: ' + bench(diffGetTime) + 'ms' );

すごい! getTime()を使用する方がはるかに高速です!これは、型変換がないため、エンジンが最適化するのがはるかに簡単だからです。

さて、何かが得られました。しかし、これはまだ良いベンチマークではありません。

bench(diffSubtract)の実行時にCPUが並行して何かを実行しており、リソースを消費していたと想像してみてください。そして、bench(diffGetTime)を実行するまでに、その作業は完了しています。

最新のマルチプロセスOSでは、かなり現実的なシナリオです。

その結果、最初のベンチマークは2番目のベンチマークよりもCPUリソースが少なくなります。これは、間違った結果につながる可能性があります。

より信頼性の高いベンチマークのために、ベンチマークの全体のパックを複数回再実行する必要があります。

たとえば、次のようにします。

function diffSubtract(date1, date2) {
  return date2 - date1;
}

function diffGetTime(date1, date2) {
  return date2.getTime() - date1.getTime();
}

function bench(f) {
  let date1 = new Date(0);
  let date2 = new Date();

  let start = Date.now();
  for (let i = 0; i < 100000; i++) f(date1, date2);
  return Date.now() - start;
}

let time1 = 0;
let time2 = 0;

// run bench(diffSubtract) and bench(diffGetTime) each 10 times alternating
for (let i = 0; i < 10; i++) {
  time1 += bench(diffSubtract);
  time2 += bench(diffGetTime);
}

alert( 'Total time for diffSubtract: ' + time1 );
alert( 'Total time for diffGetTime: ' + time2 );

最新のJavaScriptエンジンは、何度も実行される「ホットコード」にのみ高度な最適化を適用し始めます(めったに実行されないものを最適化する必要はありません)。したがって、上記の例では、最初の実行は十分に最適化されていません。ウォームアップランを追加することをお勧めします。

// added for "heating up" prior to the main loop
bench(diffSubtract);
bench(diffGetTime);

// now benchmark
for (let i = 0; i < 10; i++) {
  time1 += bench(diffSubtract);
  time2 += bench(diffGetTime);
}
マイクロベンチマークを行う際には注意してください。

最新のJavaScriptエンジンは多くの最適化を実行します。特に、演算子の動作や組み込み関数など、非常に小さなものをベンチマークする場合、「通常の使用法」と比較して「人工テスト」の結果を調整する場合があります。したがって、パフォーマンスを真剣に理解したい場合は、JavaScriptエンジンの仕組みを調べてください。そして、おそらくマイクロベンチマークはまったく必要ないでしょう。

V8に関する素晴らしい記事のパックは、https://mrale.ph にあります。

文字列からのDate.parse

メソッド Date.parse(str) は、文字列から日付を読み取ることができます。

文字列の形式は、YYYY-MM-DDTHH:mm:ss.sssZ である必要があります。ここで、

  • YYYY-MM-DD – は日付:年-月-日です。
  • 文字 "T" は区切り文字として使用されます。
  • HH:mm:ss.sss – は時刻:時、分、秒、ミリ秒です。
  • オプションの 'Z' 部分は、+-hh:mm 形式の時刻帯を示します。単一の文字 Z はUTC+0を意味します。

YYYY-MM-DDYYYY-MM、さらには YYYY のような、より短いバリアントも可能です。

Date.parse(str) の呼び出しは、指定された形式で文字列を解析し、タイムスタンプ(1970年1月1日UTC+0からのミリ秒数)を返します。形式が無効な場合は、NaN を返します。

例えば

let ms = Date.parse('2012-01-26T13:51:50.417-07:00');

alert(ms); // 1327611110417  (timestamp)

タイムスタンプからすぐに new Date オブジェクトを作成できます

let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') );

alert(date);

まとめ

  • JavaScriptの日付と時刻は、Date オブジェクトで表されます。「日付のみ」または「時刻のみ」を作成することはできません。Date オブジェクトは常に両方を含みます。
  • 月はゼロからカウントされます(そうです、1月はゼロ月です)。
  • getDay() の曜日は、ゼロからカウントされます(これは日曜日です)。
  • Date は、範囲外のコンポーネントが設定されている場合、自動的に修正されます。日/月/時を加算/減算するのに適しています。
  • 日付は減算でき、ミリ秒単位の差が得られます。これは、Date が数値に変換されるとタイムスタンプになるためです。
  • 現在のタイムスタンプを高速に取得するには、Date.now() を使用します。

他の多くのシステムとは異なり、JavaScriptのタイムスタンプは秒単位ではなく、ミリ秒単位であることに注意してください。

より正確な時間測定が必要な場合があります。JavaScript自体にはマイクロ秒(1秒の100万分の1)単位で時間を測定する方法はありませんが、ほとんどの環境で提供されています。たとえば、ブラウザには、ページの読み込み開始からのミリ秒数をマイクロ秒精度(小数点以下3桁)で示す performance.now() があります。

alert(`Loading started ${performance.now()}ms ago`);
// Something like: "Loading started 34731.26000000001ms ago"
// .26 is microseconds (260 microseconds)
// more than 3 digits after the decimal point are precision errors, only the first 3 are correct

Node.jsには、microtime モジュールやその他の方法があります。技術的には、ほとんどすべてのデバイスと環境でより高い精度を得ることができますが、それは Date にはありません。

タスク

重要度:5

2012年2月20日午前3時12分の日付の Date オブジェクトを作成します。タイムゾーンはローカルです。

alert を使用して表示します。

new Date コンストラクターは、ローカルタイムゾーンを使用します。そのため、覚えておくべき重要なことは、月がゼロから始まることだけです。

つまり、2月は1番です。

日付コンポーネントとして数値を使用した例を次に示します

//new Date(year, month, date, hour, minute, second, millisecond)
let d1 = new Date(2012, 1, 20, 3, 12);
alert( d1 );

次のように、文字列から日付を作成することもできます

//new Date(datastring)
let d2 = new Date("2012-02-20T03:12");
alert( d2 );
重要度:5

曜日を短い形式(「月」、「火」、「水」、「木」、「金」、「土」、「日」)で表示する関数 getWeekDay(date) を記述します。

例えば

let date = new Date(2012, 0, 3);  // 3 Jan 2012
alert( getWeekDay(date) );        // should output "TU"

テスト付きのサンドボックスを開きます。

メソッド date.getDay() は、日曜日から始まる曜日の番号を返します。

曜日の配列を作成して、番号で適切な曜日名を取得できるようにしましょう

function getWeekDay(date) {
  let days = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'];

  return days[date.getDay()];
}

let date = new Date(2014, 0, 3); // 3 Jan 2014
alert( getWeekDay(date) ); // FR

サンドボックスでテスト付きのソリューションを開きます。

重要度:5

ヨーロッパ諸国では、曜日は月曜日(番号1)から始まり、火曜日(番号2)、日曜日(番号7)まで続きます。date の「ヨーロッパ」の曜日を返す関数 getLocalDay(date) を記述します。

let date = new Date(2012, 0, 3);  // 3 Jan 2012
alert( getLocalDay(date) );       // tuesday, should show 2

テスト付きのサンドボックスを開きます。

function getLocalDay(date) {

  let day = date.getDay();

  if (day == 0) { // weekday 0 (sunday) is 7 in european
    day = 7;
  }

  return day;
}

サンドボックスでテスト付きのソリューションを開きます。

重要度:4

date から days 日前の日付を返す関数 getDateAgo(date, days) を作成します。

たとえば、今日が20日の場合、getDateAgo(new Date(), 1) は19日で、getDateAgo(new Date(), 2) は18日である必要があります。

days=365 以上で確実に動作する必要があります

let date = new Date(2015, 0, 2);

alert( getDateAgo(date, 1) ); // 1, (1 Jan 2015)
alert( getDateAgo(date, 2) ); // 31, (31 Dec 2014)
alert( getDateAgo(date, 365) ); // 2, (2 Jan 2014)

追伸 関数は、指定された date を変更しないでください。

テスト付きのサンドボックスを開きます。

考え方は簡単です。date から指定された日数を引くことです

function getDateAgo(date, days) {
  date.setDate(date.getDate() - days);
  return date.getDate();
}

…しかし、関数は date を変更しないでください。これは重要なことです。なぜなら、日付を提供する外部コードは、日付が変更されることを期待していないからです。

実装するには、次のように日付を複製しましょう

function getDateAgo(date, days) {
  let dateCopy = new Date(date);

  dateCopy.setDate(date.getDate() - days);
  return dateCopy.getDate();
}

let date = new Date(2015, 0, 2);

alert( getDateAgo(date, 1) ); // 1, (1 Jan 2015)
alert( getDateAgo(date, 2) ); // 31, (31 Dec 2014)
alert( getDateAgo(date, 365) ); // 2, (2 Jan 2014)

サンドボックスでテスト付きのソリューションを開きます。

重要度:5

月の最後の日を返す関数 getLastDayOfMonth(year, month) を記述します。月末は30日、31日、または2月の場合は28日/29日です。

パラメータ

  • year – 4桁の年、たとえば2012。
  • month – 月、0から11まで。

たとえば、getLastDayOfMonth(2012, 1) = 29 (うるう年、2月)です。

テスト付きのサンドボックスを開きます。

次の月を使用して日付を作成しますが、日はゼロとして渡します

function getLastDayOfMonth(year, month) {
  let date = new Date(year, month + 1, 0);
  return date.getDate();
}

alert( getLastDayOfMonth(2012, 0) ); // 31
alert( getLastDayOfMonth(2012, 1) ); // 29
alert( getLastDayOfMonth(2013, 1) ); // 28

通常、日付は1から始まりますが、技術的には任意の数値を渡すことができ、日付は自動的に調整されます。そのため、0を渡すと、「月の1日目の1日前」、つまり「前月の最後の日」を意味します。

サンドボックスでテスト付きのソリューションを開きます。

重要度:5

今日の最初から経過した秒数を返す関数 getSecondsToday() を記述します。

たとえば、現在が午前10時で、夏時間シフトがない場合、

getSecondsToday() == 36000 // (3600 * 10)

関数はどの曜日でも機能する必要があります。つまり、「今日」のハードコードされた値を持つことはできません。

秒数を取得するには、現在の日付と時刻00:00:00を使用して日付を生成し、それを「現在」から減算します。

差は、その日から経過したミリ秒数であり、秒を取得するには1000で割る必要があります

function getSecondsToday() {
  let now = new Date();

  // create an object using the current day/month/year
  let today = new Date(now.getFullYear(), now.getMonth(), now.getDate());

  let diff = now - today; // ms difference
  return Math.round(diff / 1000); // make seconds
}

alert( getSecondsToday() );

代替ソリューションは、時/分/秒を取得して秒に変換することです

function getSecondsToday() {
  let d = new Date();
  return d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds();
}

alert( getSecondsToday() );
重要度:5

明日までの秒数を返す関数 getSecondsToTomorrow() を作成します。

たとえば、現在が23:00の場合、

getSecondsToTomorrow() == 3600

追伸 関数はどの曜日でも機能する必要があり、「今日」はハードコードされていません。

明日までのミリ秒数を取得するには、「明日00:00:00」から現在の日付を引くことができます。

まず、「明日」を生成してから、それを行います

function getSecondsToTomorrow() {
  let now = new Date();

  // tomorrow date
  let tomorrow = new Date(now.getFullYear(), now.getMonth(), now.getDate()+1);

  let diff = tomorrow - now; // difference in ms
  return Math.round(diff / 1000); // convert to seconds
}

代替ソリューション

function getSecondsToTomorrow() {
  let now = new Date();
  let hour = now.getHours();
  let minutes = now.getMinutes();
  let seconds = now.getSeconds();
  let totalSecondsToday = (hour * 60 + minutes) * 60 + seconds;
  let totalSecondsInADay = 86400;

  return totalSecondsInADay - totalSecondsToday;
}

多くの国では夏時間(DST)が採用されているため、23時間または25時間の日がある場合があります。そのような日は別々に扱う必要があるかもしれません。

重要度:4

次のように date を書式設定する関数 formatDate(date) を記述します

  • date から経過した時間が1秒未満の場合、「right now(たった今)」です。
  • それ以外の場合、date から経過した時間が1分未満の場合、「n秒前」です。
  • それ以外の場合、1時間未満の場合、「m分前」です。
  • それ以外の場合、"DD.MM.YY HH:mm" 形式の完全な日付です。つまり、「日.月.年 時:分」で、すべて2桁の形式です(例:31.12.16 10:00)。

例えば

alert( formatDate(new Date(new Date - 1)) ); // "right now"

alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30 sec. ago"

alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5 min. ago"

// yesterday's date like 31.12.16 20:00
alert( formatDate(new Date(new Date - 86400 * 1000)) );

テスト付きのサンドボックスを開きます。

date から現在までの時間を取得するには、日付を減算します。

function formatDate(date) {
  let diff = new Date() - date; // the difference in milliseconds

  if (diff < 1000) { // less than 1 second
    return 'right now';
  }

  let sec = Math.floor(diff / 1000); // convert diff to seconds

  if (sec < 60) {
    return sec + ' sec. ago';
  }

  let min = Math.floor(diff / 60000); // convert diff to minutes
  if (min < 60) {
    return min + ' min. ago';
  }

  // format the date
  // add leading zeroes to single-digit day/month/hours/minutes
  let d = date;
  d = [
    '0' + d.getDate(),
    '0' + (d.getMonth() + 1),
    '' + d.getFullYear(),
    '0' + d.getHours(),
    '0' + d.getMinutes()
  ].map(component => component.slice(-2)); // take last 2 digits of every component

  // join the components into date
  return d.slice(0, 3).join('.') + ' ' + d.slice(3).join(':');
}

alert( formatDate(new Date(new Date - 1)) ); // "right now"

alert( formatDate(new Date(new Date - 30 * 1000)) ); // "30 sec. ago"

alert( formatDate(new Date(new Date - 5 * 60 * 1000)) ); // "5 min. ago"

// yesterday's date like 31.12.2016 20:00
alert( formatDate(new Date(new Date - 86400 * 1000)) );

代替ソリューション

function formatDate(date) {
  let dayOfMonth = date.getDate();
  let month = date.getMonth() + 1;
  let year = date.getFullYear();
  let hour = date.getHours();
  let minutes = date.getMinutes();
  let diffMs = new Date() - date;
  let diffSec = Math.round(diffMs / 1000);
  let diffMin = diffSec / 60;
  let diffHour = diffMin / 60;

  // formatting
  year = year.toString().slice(-2);
  month = month < 10 ? '0' + month : month;
  dayOfMonth = dayOfMonth < 10 ? '0' + dayOfMonth : dayOfMonth;
  hour = hour < 10 ? '0' + hour : hour;
  minutes = minutes < 10 ? '0' + minutes : minutes;

  if (diffSec < 1) {
    return 'right now';
  } else if (diffMin < 1) {
    return `${diffSec} sec. ago`
  } else if (diffHour < 1) {
    return `${diffMin} min. ago`
  } else {
    return `${dayOfMonth}.${month}.${year} ${hour}:${minutes}`
  }
}

サンドボックスでテスト付きのソリューションを開きます。

チュートリアルマップ

コメント

コメントする前にこれを読んでください…
  • 改善のための提案がある場合は、コメントする代わりに、GitHub issue またはプルリクエストを送信してください。
  • 記事の内容が理解できない場合は、詳しく説明してください。
  • 短いコードを挿入するには、<code> タグを使用し、複数行の場合は <pre> タグで囲み、10行を超える場合はサンドボックス(plnkrjsbincodepen…)を使用してください。